0

我想做类似的事情:

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 类别返回为空,而我已验证上述字段中至少有两个确实包含值。

我希望得到类似[鞋子]-[凉鞋]-[煎饼]-[肉桂面包]之类的东西

4

1 回答 1

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

请注意,如果 aCASE失败并且它没有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'
于 2013-08-07T20:08:25.550 回答