你所做的一切都很好——你只是忘记了双引号引用的名称
case
导致
二者都
这个
select
列表和
order by
。引号不匹配会使大小写生成名为的列
strippedname
虽然
订单依据
查找
StrippedName
但没有找到,扔了一个
ERROR: column "StrippedName" does not exist
LINE 9: order by "StrippedName";
^
如果你把引号同时放在两个地方或同时使用,效果会很好:
demo at db<>fiddle
create table myTable ("Name" text);
insert into myTable values ('2abc-def'),('3abcdef'),('1abc def')
select case
when strpos("Name",' ') > 0
then substr("Name", 0, strpos("Name", ' '))
when strpos("Name",'-') > 0
then substr("Name", 0, strpos("Name", '-'))
else "Name"
end as "StrippedName" --without " it was folded to "strippedname"
from myTable
order by "StrippedName"--was looking for a case-sensitive "StrippedName"
--order by 1 --you could also pick a column by its position
医生的提醒
PostgreSQL lexical structure
:
引用标识符也使其区分大小写,而未引用的名称总是折叠成小写。
您也可以使用列位置而不是其名称:
order by 1
每个表达式都可以是名称
或序数
的值,或者它可以是由输入列值形成的任意表达式。