如何基于列串联构建 PostgreSQL ORDER BY 表达式?

Dav*_*ave 3 postgresql order-by concat postgresql-9.5

我正在使用 Postgres 9.5。我想为一系列连接的字符串编写一个 order by 表达式,但我不确定这是否可能或如何做到。我拼凑了以下内容

myproject=> SELECT  "my_objects".* 
            FROM "my_objects" 
              left join addresses on my_objects.address_id = addresses.id 
            WHERE (my_objects.name ILIKE '%my_object%' 
              AND EXISTS (SELECT * 
                          FROM my_object_times 
                          WHERE my_object_times.my_object_id = my_objects.id)) 
            order by lower(addresses.city) || "," || addresses.state_id; 

ERROR:  column "," does not exist 
LINE 1: ...id = my_objects.id)) order by lower(addresses.city) || "," || add...
Run Code Online (Sandbox Code Playgroud)

但正如您所看到的,有一个错误抱怨语法。我正在尝试做的事情是否可能,如果可以的话,我如何编写基于列串联的 order by 子句?

Eva*_*oll 5

在这里我可以说两件事,

  1. 解决办法:","','单引号不同的是字面引号机制。双引号表示指定的列,完全有效,但在实践中可能会很糟糕CREATE TABLE foo ("," int);

    -- Identifier quoting
    order by lower(addresses.city) || "," || addresses.state_id;
    -- Literal quoting
    order by lower(addresses.city) || ',' || addresses.state_id;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 更大的问题:为什么要连接字符串?它只能减慢速度或失去准确性。您可以按多栏排序;就这样做..

    order by lower(addresses.city), addresses.state_id;
    
    Run Code Online (Sandbox Code Playgroud)