如何在自定义表达式中传播NULL值?

时间:2015-11-02 15:31:37

标签: sql-server sql-server-2012

我目前对以下表单有疑问:

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 NULLNULL

是否有一些构造FOO让我说

FOO(<nullcheck_expression>, <result_expression>)

并返回与IIF(<nullcheck_expression> IS NOT NULL, <result_expression>, NULL)相同的内容?

4 个答案:

答案 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,则它将连接到NULLLEFT函数将返回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。这是我能找到的最短的解决方案。