sql - 连接case语句

时间:2013-08-07 19:58:17

标签: sql concatenation case

我想做类似的事情:

SELECT
   ('['+twt.dept+']' + 
     CASE WHEN twt.typ <> 'EMPTY' AND twt.typ > '' THEN '-['+twt.typ+']' END
     + CASE WHEN twt.subtyp_1 <> 'EMPTY' AND twt.subtyp_1 > '' THEN '-['+twt.subtyp_1+']' END
     + CASE WHEN twt.subtyp_2 <> 'EMPTY' AND twt.subtyp_2 > '' THEN '-['+twt.subtyp_2+']' END
     + CASE WHEN twt.subtyp_3 <> 'EMPTY' AND twt.subtyp_3 > '' THEN '-['+twt.subtyp_3+']' END) AS category
FROM table1 AS tb1
JOIN table2 AS twt ON (tb1.id = twt.id)

我知道我可以使用合并或使用堆叠案例,但是他们无论如何都要使用更简单的语法,就像我在这里实现这一点(特别是没有针对第5个案例的怪物案例陈述)?

PS类别回归为空,而我已经确认上述字段的至少两个确实包含值。

我希望得到像[鞋子] - [凉鞋] - [煎饼] - [肉桂面包]

1 个答案:

答案 0 :(得分:3)

我认为您不能缩短查询时间。你甚至使用单独的字段。从技术上讲,你可以使用一些执行CASE WHEN工作的函数,但我认为增益不够。

CREATE FUNCTION CheckAndAdd(@str VARCHAR(255)) RETURNS VARCHAR(255) AS
BEGIN
    RETURN CASE WHEN @str <> 'EMPTY' AND @str <> '' THEN '-['+@str+']' ELSE '' END
END

请注意,如果CASE失败并且没有ELSE,则会返回NULL,并在SQL 'Hello' + NULL = NULL

简单测试:

SELECT 'Hello ' + CASE WHEN 1 = 0 THEN 'None' END + ' World'

正确测试:

SELECT 'Hello ' + CASE WHEN 1 = 0 THEN 'None' ELSE '' END + ' World'