我有下面的SQL,它只接受从Name列到出现空格或连字符的位置的数据。我想按case语句的输出对结果进行排序,但找不到方法。
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
from myTable
order by "StrippedName"
字符串
2条答案
按热度按时间kq4fsx7k1#
只要您对
case
的名称加上双引号,就完全可以得到 *select
列表 * 和 *order by
。不匹配的引号会使case
生成一个名为strippedname
的列,而order by
查找StrippedName
但没有找到,从而引发字符串
如果你在两个地方都放上引号,或者在两个地方都使用引号,它会很好地工作:demo at db<>fiddle
型
| StrippedName|
| --|
| 1abc|
| 2abc|
| 3abcdef|
来自PostgreSQL词法结构文档的提示:
引用标识符也会使其区分大小写,而未引用的名称则始终折叠为小写。
您也可以使用列位置而不是其名称:
order by 1
每个表达式可以是输出列(SELECT列表项)的名称或序号,也可以是由输入列值形成的任意表达式。
possible将整个
case
缩减为一个带有POSIX正则表达式的子字符串:型
它寻找的字符序列不是连字符
-
或空格``,所以它会返回任何一个字符的第一个位置之前的所有字符(如果两者都没有找到,则返回整个字符)。使用+
而不是*
可以跳过前导分隔符,寻找非空匹配。pinkon5k2#
你可以使用一个子查询:
字符串