【问题标题】:Concatenate with NULL values in SQL在 SQL 中与 NULL 值连接
【发布时间】:2012-01-04 05:55:12
【问题描述】:
Column1      Column2
-------      -------
 apple        juice
 water        melon
 banana
 red          berry       

我有一个有两列的表。 Column1 有一组单词,Column2 也有一组单词。我想用 + 运算符连接它们,没有空格。

例如:苹果汁

问题是,如果第二列中有空值,我只想将第一个元素作为结果。

例如:香蕉

Result
------
applejuice
watermelon
banana
redberry

但是,当我使用 column1 + column2 时,如果 Comunm2 为 NULL,它会给出一个 NULL 值。我想要“香蕉”作为结果。

【问题讨论】:

  • 我发现的不仅仅是字符串。我不知道它是否最有效,但您始终可以将列包装在 isNull 语句中。即: isNull(column1, '') + isNull(column2,'') 当它找到 null 时,它会用空字符串替换它。我尚未对此进行测试,因此请告诉我它是否有效。

标签: sql database string null concatenation


【解决方案1】:

使用 COALESCE 函数将 NULL 值替换为空字符串。

SELECT Column1 + COALESCE(Column2, '') AS Result
    FROM YourTable

【讨论】:

    【解决方案2】:

    我不确定您将什么用作数据库,但我会为您的特定 SQL 方言寻找“合并”函数并使用它。

    【讨论】:

      【解决方案3】:

      默认情况下,TSQL 中用于连接的 + 符号会将字符串 + null 组合为 null 作为未知值。

      你可以做两件事之一,你可以改变这个控制 Sql 应该对 Nulls 做什么的会话变量

      http://msdn.microsoft.com/en-us/library/ms176056.aspx

      或者您可以在连接之前将每一列合并为一个空字符串。

      COALESCE(Column1, '')
      

      http://msdn.microsoft.com/en-us/library/ms190349.aspx

      【讨论】:

        【解决方案4】:

        标准 SQL 要求包含 NULL 的字符串连接生成 NULL 输出,但这是使用 || 操作编写的:

        SELECT a || b
          FROM SomeTable;
        

        如果ab 或两者都包含NULL,则输出将为null。

        使用+ 连接字符串表示您正在使用特定于DBMS 的扩展。行为可能与标准要求的相同 - 实际上,这似乎是您问题的要点。

        一些 DBMS - 特别是 Oracle - 倾向于将空字符串视为等同于空字符串;然后你可以愉快地连接起来。但是,如果使用 || 运算符,则该行为并非严格符合标准。

        考虑在连接之前使用 COALESCE 或 NVL 或 IFNULL 或一些类似的函数将 NULL 映射到空字符串。

        【讨论】:

          【解决方案5】:

          如果您使用的是 MySq,请使用 ifnull(Column2, '')

          【讨论】:

            【解决方案6】:

            你可以做一个union:

            (SELECT Column1 + Column2 FROM Table1 WHERE Column2 is not NULL)
            UNION
            (SELECT Column1 FROM Table1 WHERE Column2 is NULL);
            

            【讨论】:

              【解决方案7】:

              你可以使用case条件:

              case when column_2 is not null 
                   then concatenate
                   else column_1
              end
              

              【讨论】:

              • 这不会为其他 6 个现有答案添加任何有用的东西
              • @Adam,实际上还没有人建议将 case 表达式作为解决方案。我觉得你的评价可能太苛刻了。
              【解决方案8】:

              我发布的一些贴有 MSSQL 的帖子已被版主重命名为“SQL”。所以我假设你使用的是 MSSQL

              COALESCE 将返回第一个非空值。

              SELECT COALESCE('a', NULL, 'c')
              

              只会返回'a'

              如果您想要 Firstname + Lastname,有时其中一个或另一个为 NULL,请使用 CONCAT。 Concat 将字符串加在一起,并将 NULLS 替换为 0 长度的非空值。

               SELECT CONCAT('a', NULL, 'c')
              

              将返回“ac”

              如果你想要 Fn 空间 + 中间名空间 + LN,将 concatinate 与 CONCAT 结合起来:

              SELECT CONCAT('a' + ' ', NULL + ' ', 'c')
              

              将返回“a c”。

              middlename (null) 后面的空格用 + 和 NULL 消除。

              NULL + ' ' 为空。

              因此,在 Middlename 或 Firstname 为 null 的情况下,您不会得到多余的不需要的空格。

              【讨论】:

              • 这太完美了!我必须在字段上执行 RTRIM(LTRIM(x)),然后我做了一个 case 语句来检查连接的最后一个字符是否是我使用的分隔符 (;) 所以我可以去掉它,以防万一最后还有一个。
              猜你喜欢
              • 2014-08-29
              • 1970-01-01
              • 2011-02-24
              • 1970-01-01
              • 1970-01-01
              • 2016-09-07
              • 1970-01-01
              • 1970-01-01
              • 2023-03-26
              相关资源
              最近更新 更多