用于比较由数字和文本组成的字符串的SQL

时间:2013-01-09 22:24:27

标签: sql postgresql sorting postgresql-9.2 natural-sort

我需要比较包含数字和可能文本的2个字符串。例如我有这张表:

id | label 1  |  label 2 | 
1  |  12/H    |     1    |
2  |   4/A    |    41/D  |
3  |  13/A    |     3/F  |
4  |   8/A    |     8/B  |
..

我需要确定方向,以便如果标签1< Label2然后Direction是W(with)否则它是A(反对)。所以我必须构建一个以这种方式呈现数据的视图:

id | Direction  
1  |     A    |   
2  |     W    |
3  |     A    |
4  |     W    |
..

我正在使用postgres 9.2。

2 个答案:

答案 0 :(得分:2)

WITH x AS (
   SELECT id
         ,split_part(label1, '/', 1)::int AS l1_nr
         ,split_part(label1, '/', 2)      AS l1_txt
         ,split_part(label2, '/', 1)::int AS l2_nr
         ,split_part(label2, '/', 2)      AS l2_txt
   FROM t
   )
SELECT id
      ,CASE WHEN (l1_nr, l1_txt) < (l2_nr, l2_txt)
       THEN 'W' ELSE 'A' END AS direction
FROM   x;

我用split_part()拆分这两个部分并检查特殊的行类型以检查哪个标签更大。

两个标签相等或者任何一个为NULL的情况尚未定义。

CTE不是必需的,只是为了让它更容易阅读。

-> sqlfiddle

答案 1 :(得分:0)

您可以尝试以下内容:

SELECT id, CASE WHEN regexp_replace(label_1,'[^0-9]','','g')::numeric <
                     regexp_replace(label_2,'[^0-9]','','g')::numeric
                THEN 'W'
                ELSE 'A'
           END
FROM table1

regexp_replace删除字符串::numeric中的所有非数字字符,将字符串转换为numeric

此处的详细信息:regexp_replacepattern matchingCASE WHEN