我需要比较包含数字和可能文本的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。
答案 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不是必需的,只是为了让它更容易阅读。
答案 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_replace
,pattern matching,CASE WHEN