【问题标题】:SQL Server: how to add case statement to selectSQL Server:如何添加 case 语句来选择
【发布时间】:2014-03-06 16:24:46
【问题描述】:

我正在使用以下选择从数据库表中查询日期。

此查询的输入 (ms) 来自一个 xml 字符串,然后存储过程循环遍历 xml 中的所有单个值,为每个值返回一个特定的数字(整数)。 到目前为止,这工作正常。

如果输入 (ms) 为空/无,是否可以返回占位符编号(如 99999)? 目前,在这种情况下返回 0,我不能用它来识别它,因为 0 在其他情况下也可以是有效结果。

到目前为止我的存储过程:

SELECT ms as date,
    type, 
    (
        SELECT COUNT(calendar_dt)
        FROM        Calendar
        WHERE       day_of_week NOT IN (1, 7)
        AND         calendar_dt > GETDATE()
        AND         calendar_dt <= ms
    ) as bDays
FROM @dates
FOR XML PATH('ms'), ELEMENTS, TYPE, ROOT('ranks')

提前非常感谢您提供的任何帮助,蒂姆。

【问题讨论】:

    标签: sql sql-server stored-procedures if-statement case


    【解决方案1】:

    如果“ms”列实际为 NULL 或已填充,则使用 ISNULL。

    http://technet.microsoft.com/en-us/library/ms184325.aspx

    SELECT ISNULL(ms, 99999) AS date

    但是,如果该列可以包含一个空字符串,这与 NULL 不同,那么也使用 NULLIF。

    http://technet.microsoft.com/en-us/library/ms177562.aspx

    SELECT ISNULL(NULLIF(ms,''), 99999) AS date

    【讨论】:

    • 谢谢。是的,它可以包含一个空字符串,但我无法将其添加到上面的选择中,因为它会导致错误提示我的选择列表中只能有一个元素。
    • 好的,我可以添加这个,只是之前有一个错字 - 很抱歉。 ms 被定义为日期时间,因此它会从 99999 中创建一个日期,使其成为 2173-10-15T00:00:00。有没有办法避免这种情况,这样我就可以保持价值?
    • 数据类型和数据类型一样。您应该设置一个具有相同数据类型的默认值。但是您可以尝试将值 CAST 或 CONVERT 转换为字符串。
    • 事实证明,您使用 ISNULL / NULLIF 的建议是完美的解决方案,并且非常适合我的需要,只需要稍微调整我的代码的某些部分。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 2021-02-05
    相关资源
    最近更新 更多