我需要比较两个包含数字和可能文本的字符串。例如我有这张表:
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 < 标签 2 则方向为 W(同),否则为 A(反对)。所以我必须构建一个以这种方式呈现数据的 View :
id | Direction 1 | A | 2 | W | 3 | A | 4 | W | ..
我使用的是 postgres 9.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没有必要,只是为了更容易阅读。
关于用于比较由数字和文本组成的字符串的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14247611/