我想做类似的事情:
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类别回归为空,而我已经确认上述字段的至少两个确实包含值。
我希望得到像[鞋子] - [凉鞋] - [煎饼] - [肉桂面包]
答案 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'