我有三列二进制值。然后我得到一个查询,根据这些值创建一个字符串。我使用case
完成了这项工作。但它非常庞大(它是一个更大的查询的一部分),我想知道可能有更好的方法吗?
SELECT (CASE
WHEN TableA.flag1 = 1 AND TableA.flag2 = 1 AND TableA.flag3 = 1 THEN 'CGR'
WHEN TableA.flag1 = 1 AND TableA.flag2 = 1 THEN 'CG'
WHEN TableA.flag1 = 1 AND TableA.flag3 = 1 THEN 'CR'
WHEN TableA.flag2 = 1 AND TableA.flag3 = 1 THEN 'GR'
WHEN TableA.flag1 = 1 THEN 'C'
WHEN TableA.flag2 = 1 THEN 'G'
WHEN TableA.flag3 = 1 THEN 'R'
ELSE 'nothing'
END)
FROM TableA
我正在使用MSSQL 2000服务器。
答案 0 :(得分:5)
我不知道这是否“更好”,但它更简洁:
SELECT ((CASE WHEN TableA.flag1 = 1 THEN 'C' ELSE '' END) +
(CASE WHEN TableA.flag2 = 1 THEN 'G' ELSE '' END) +
(CASE WHEN TableA.flag3 = 1 THEN 'R' ELSE '' END)
)
FROM TableA;
好的,这不完全相同,因为你得到''
而不是'nothing'
。但我认为空字符串比'nothing'
更好地表示“无标志”。
答案 1 :(得分:5)
您可以改为使用left()
。
select left('C', T.flag1)+
left('G', T.flag2)+
left('R', T.flag3)
from TableA as T
答案 2 :(得分:1)
试试这个:
SELECT
CASE WHEN flag1 = 1 THEN 'C' ELSE '' END +
CASE WHEN flag2 = 1 THEN 'G' ELSE '' END +
CASE WHEN flag3 = 1 THEN 'R' ELSE '' END
FROM TABLEA
答案 3 :(得分:0)
也许您可以使用函数并将此CASE语句移动到此函数