我目前对以下表单有疑问:
SELECT
CASE
WHEN <column> IS NOT NULL THEN <expression>
ELSE NULL
AS <new_column>,
CASE
WHEN <other_column> IS NOT NULL THEN <other_expression>
ELSE NULL
AS <new_other_column>,
-- etc...
我认为必须有可能将CASE
语句重写为更容易阅读的内容,而且模板更少。
我可以使用IIF
:
IIF(<column> IS NOT NULL, <expression>, NULL) AS <new_column>
但仍有IS NOT NULL
和NULL
。
是否有一些构造FOO
让我说
FOO(<nullcheck_expression>, <result_expression>)
并返回与IIF(<nullcheck_expression> IS NOT NULL, <result_expression>, NULL)
相同的内容?
答案 0 :(得分:1)
我想我提出的问题的答案是“不,SQL Server内置了这样的功能”。
相反,我最终使用了IIF
-function,它与一些放置良好的换行符相比,仍然比原始distLDAModel.topicDistributions
语句好得多。让CASE
遍布各处都很烦人,但由于它们都是MS SQL Management Studio和Visual Studio以低对比度灰色突出显示的关键字,因此我可以接受它。
答案 1 :(得分:0)
您可以尝试通过将NULL
值与<expression>
值连接来利用SQL中的<column>
行为。
SELECT LEFT(<expression> + <column>, n)
其中n
是<expression>
值的长度。如果<column>
值为NULL
,则它将连接到NULL
,LEFT
函数将返回NULL
。否则,它只会从<expression>
连接中获取<expression> + <column>
。
答案 2 :(得分:0)
您可以删除ELSE NULL
部分,这有点帮助:
CASE WHEN <column> IS NOT NULL THEN <expression> END AS <new_column>
我还重新格式化为单行以减少垂直空间。
答案 3 :(得分:0)
如果您确认列和表达式都是varchar
类型,那么这里有一个小技巧:
DECLARE @t TABLE(v varchar(10))
INSERT INTO @t VALUES('test'), (NULL)
SELECT LEFT(v, 0) + 'your expression' AS ExpressionResult
FROM @t
输出:
ExpressionResult
your expression
NULL
说明:如果列包含一些数据,它将返回LEFT(v, 0) = ''
,如果它为null,则返回LEFT(v, 0) = NULL
。这是我能找到的最短的解决方案。