【问题标题】:Case with NULL expression in SQL ServerSQL Server 中带有 NULL 表达式的案例
【发布时间】:2015-02-18 19:46:35
【问题描述】:

我对这段代码有疑问,我很确定解决方案很简单,但我没有看到。

CASE @L0 WHEN '/' THEN NULL ELSE @L0 END

这是我用来从平面文件 (csv) 中导入数据的代码的一部分,其中 NULL 存储为 /。问题是@L0 也可以是由另一个程序填充的输入变量,并且它可能为 NULL。由于不允许在 CASE 中使用 NULL 值作为表达式,代码不起作用,我收到一条错误消息。

谁能告诉我正确的做法?

【问题讨论】:

  • 那么如果@L0NULL,结果应该是什么?
  • CASE ISNULL(@L0, '/') WHEN '/' THEN NULL END

标签: sql-server expression case coalesce nullif


【解决方案1】:

如果您只想将 '/' 替换为 NULL 并保持所有其他字符串不变,您可以使用 NULLIF() 函数,例如NULLIF(@Lo, '/')

【讨论】:

  • 我已经尝试过NULLIF和COALESCE,但还是同样的问题:表达式不允许为NULL
  • 表达式只能是NULL常量。因此,只有当您(或您的 SQL 代码生成)按字面意思编写 NULLIF(NULL, '/') 时,您才会收到错误消息。这是因为如果将NULL 作为常量传递,SQL Server 无法确定返回值的类型。
  • 完全正确。但是如何解决呢?
  • 我不明白。有什么要解决的。你不能传递一个NULL 常量吗?是因为你生成了 SQL 字符串吗?如果是这样,您可以只转换值,例如NULLIF(cast(NULL as <someDataType>), '/') 其中<someDataType>应该是您输入的数据类型。但据我了解您的示例,您不是将 NULL 作为 constant 传递,而是作为 @LO 变量的值传递,在这种情况下没有问题。
  • 几乎解决了我的问题...这里成功了:CAST(NULLIF(@L0, '/') AS NUMERIC(18)) 谢谢!
【解决方案2】:

将 NULL 值映射到 '/' 或任何其他字符串:

 CASE COALESCE(@L0, '/') WHEN '/' THEN NULL ELSE @L0 END

 CASE COALESCE(@L0, 'other string') WHEN '/' THEN NULL ELSE COALESCE(@L0, 'other string') END

“其他字符串”当然不应该作为@L0 的常规非空内容出现。如果@L0 上的结果应该是“/”作为“其他字符串”,请使用这个:

 CASE COALESCE(@L0, 'other string') WHEN '/' THEN NULL ELSE COALESCE(@L0, '/') END

【讨论】:

  • 那也行不通。如果@L0 为NULL,则表达式也再次为NULL。 CASE COALESCE(null, '/') WHEN '/' THEN NULL ELSE null END
  • 因为我需要在插入语句中包含命令,所以我不能以这种方式使用您的建议。无论如何,克里斯蒂安的回答让我走上了正轨,我能够用他(以及其他人的帮助)的回答解决我的问题。谢谢!
【解决方案3】:

尝试以下操作,如果 @L0 为 null,则默认为 '/':

CASE COALESCE(@L0, '/') WHEN '/' THEN NULL ELSE @L0 END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    相关资源
    最近更新 更多