1

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

编号 | 标签 1 | 标签 2 |
1 | 12/小时 | 1 |
2 | 4/A | 41/天 |
3 | 13/A | 三楼 |
4 | 8/A | 8/B |
..

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

编号 | 方向  
1 | 一个 |   
2 | W |
3 | 一个 |
4 | W |
..

我正在使用 postgres 9.2。

4

2 回答 2

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

于 2013-01-09T22:44:07.233 回答
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_replace模式匹配CASE WHEN

于 2013-01-09T22:43:17.580 回答