【问题标题】:SQL Server CASE With concatenating columns具有连接列的 SQL Server CASE
【发布时间】:2019-04-11 06:57:29
【问题描述】:

我正在尝试创建一个列,其值有条件地基于已指定的 DB 列。

我有 6 列:

ColumnA
ColumnB
ColumnC
ColumnD
ColumnE
ColumnF 

我有一个查询,用于创建此列CUSTOMCODE,它将根据 6 列的值确定,无论哪一个为空。

我一直在使用 CASE 语句来尝试生成我想要的结果,但是有几行返回 null。我的case语句的逻辑如下

CASE
    WHEN ColumnA IS NOT NULL and ColumnB IS NOT NULL
         THEN ColumnA + '-' + ColumnC + '-' + ColumnD + '-' + ColumnB
    WHEN ColumnA IS NOT NULL  and ColumnB IS NULL
         THEN ColumnA + '-' + ColumnC + '-' + ColumnD
    WHEN ColumnE IS NOT NULL
         THEN ColumnE + '-' + ColumnF
END AS CUSTOMCODE

注意此数据库中的数据,在此示例中,ColumnB 对于每一行都是 NULL。

当此查询运行时,对于 ColumnA, ColumnC, and ColumnD 为非 null 的第一行,它会正确返回第一种情况,并且 CUSTOMCODE 会产生非 null 值。

对于第二行,相同的ColumnA, ColumnC, and ColumnD 也不为空,它为 CUSTOMCODE 返回一个 NULL 值,我不知道为什么。

以及我们的后端的结构方式和数据的输入方式,如果这 3 列为空,则 ColumnE and ColumnF are not null,但是对于这种情况的行,它也会导致 CUSTOMCODE 为空。

CASE 声明中是否缺少某些内容,或者我是否需要对其进行重组或做其他事情?

【问题讨论】:

  • 一些示例数据在这里会有很长的路要走。 Start Here 根据需要编辑您的问题。
  • 我将处理示例数据。真实的数据和环境存在于私有敏感网络上,所以我必须尽可能地概括。我将重新编辑更多细节以更加清晰。

标签: sql sql-server sql-server-2012 concatenation case


【解决方案1】:

我想你想要:

select stuff( coalesce('-' + columna, '') +
              coalesce('-' + columnb, '') +
              coalesce('-' + columnc, '') +
              coalesce('-' + columnd, '') +
              coalesce('-' + columne, '') +
              coalesce('-' + columnf, ''), 1, 1, ''
             ) as concatenated_together_with_hyphen

这相当于其他数据库中的concat_ws()

【讨论】:

    【解决方案2】:

    似乎最简单的方法是将它们全部包装在IS NULL

    select isnull(ColumnA,'') + isnull(ColumnB,'') + isnull(ColumnC,'') ...etc
    

    如果这不是您真正想要的,您需要记住,一旦第一个条件是我,CASE 语句就会退出。因此,CASE 的顺序很重要。

    例如,最后一个CASEWHEN ColumnE IS NOT NULL 可能永远不会遇到,因为在前两个CASE中,这也可能是TRUE

    注意这个数据库中的数据,在这个例子中 ColumnB 是 NULL 每一行。

    如果这是真的,那么如果ColumnA 不是NULL,那么第三个CASE 将永远不会发生,因为第二个CASEWHEN ColumnA IS NOT NULL and ColumnB IS NULL

    对于第二行,相同的 ColumnA、ColumnC 和 ColumnD 也不为空,它为 CUSTOMCODE 返回一个 NULL 值,我不知道为什么。

    您提供的代码绝对不会发生这种情况。但是,重要的是要了解 NULL空白空间 不是一回事。即select 'true' where NULL = '' 永远不会是真的。

    最后,记住任何东西 + NULL = NULL。即select 1 + NULL 将返回NULL

    【讨论】:

    • 我最终改变了我的 CASE 语句的顺序,这很有帮助。我还在列中添加了 IsNull,这有助于确保我没有连接空列。这个答案提供了最好的帮助。谢谢!
    • 很高兴帮助@OscarMcCullough
    【解决方案3】:

    我不太了解你的逻辑,但据我所知,如果其中之一是NULL,您的字段CUSTOMCODE 将是NULL

    试试这个:

    CASE
        WHEN ColumnA IS NOT NULL and ColumnB IS NOT NULL
            THEN ColumnA + '-' + ISNULL(ColumnC, '') + '-' + ISNULL(ColumnD, '') + '-' + ColumnB
        WHEN ColumnA IS NOT NULL  and ColumnB IS NULL
            THEN ColumnA + '-' + ISNULL(ColumnC, '') + '-' + ISNULL(ColumnD, '')
        WHEN ColumnE IS NOT NULL
            THEN ColumnE + '-' + ISNULL(ColumnF, '')
    END AS CUSTOMCODE
    

    虽然我建议您检查脚本的逻辑,但也许您只能使用 ISNULL()(?) 来做同样的事情

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多