1

我在 PostgreSQL 9.0 中有一个数据库,它有一个带有字符串字段的表来存储客户端代码。这些代码是字母数字的,可以以字母或数字开头,例如1, 2, A0001-4, A0001-2, 10

我想先订购数字,然后按字符串订购,例如

1, 2, 10, A0001-2, A0001-4

我这样做to_number(fields, '99999999'),例如:

SELECT * FROM empleados ORDER BY to_number(legajo, '99999999'), legajo

但是当代码像've',没有数字时,查询失败。

我能做些什么?

4

3 回答 3

1

您可以使用 case 语句来查找数字:

select *
from empleados
order by (case when legajo not similar to '%[^0-9]%' then 1 else 0 end) desc,
         (case when legajo not similar to '%[^0-9]%' then to_number(legajo, '999999999') end),
         legjo;

similar to表达式表示所有字符都是数字。

编辑:

修复了语法错误。您可以对此进行测试:

with empleados as (
      select 'abc' as legajo union all
      select '123'
     ) 
select *
from empleados
order by (case when legajo not similar to '%[^0-9]%' then 1 else 0 end) desc,
         (case when legajo not similar to '%[^0-9]%' then to_number(legajo, '999999999') end),
         legajo;

SQLFiddle 在这里

于 2013-07-27T15:38:17.100 回答
0

尝试这个:

select *
from empleados
order by
    case
        when legajo similar to '%[0-9]%' then to_number(legajo, '999999999')
        else 999999999
    end,
    legajo

sql fiddle demo

于 2013-07-27T16:36:45.667 回答
0
WITH empleados(legajo) AS (
   VALUES
     ('A0001-4'::text)
    ,('123.345-56')
    ,('ve')
    ,('123')
    ,('123 ve')
   ) 
SELECT *
FROM   empleados
ORDER  BY CASE WHEN legajo ~ '\D' THEN 1000000000::int
                                  ELSE to_number(legajo, '999999999')::int END
      ,legajo;

~是正则表达式操作符。
\D是非数字类的简写。

legajo ( legajo ~ '\D') 中包含非数字字符的行稍后出现。

-> SQLfiddle 演示

永远不要使用SIMILAR TO,它是一个完全没有意义的运算符。

于 2013-07-27T18:26:29.567 回答