代码之家  ›  专栏  ›  技术社区  ›  Jon

从列中提取子字符串的按大小写排序语句

  •  0
  • Jon  · 技术社区  · 2 年前

    我有下面的SQL,它只从“名称”列获取数据,直到出现空格或连字符为止。我想根据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"
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   Andomar    2 年前

    您可以使用子查询:

    select  *
    from    (
            select  case ... end as col1
            from    ...
            ) as SubQueryAlias
    order by
            col1
    
        2
  •  0
  •   Zegarek    2 年前

    你所做的一切都很好——你只是忘记了双引号引用的名称 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
    
    条纹状名称
    1abc
    2abc
    3abcdef

    医生的提醒 PostgreSQL lexical structure :

    引用标识符也使其区分大小写,而未引用的名称总是折叠成小写。

    您也可以使用列位置而不是其名称: order by 1

    每个表达式都可以是名称 或序数 的值,或者它可以是由输入列值形成的任意表达式。