【问题标题】:concatenate strings and coalesce连接字符串并合并
【发布时间】:2015-04-26 00:50:38
【问题描述】:

我有一个从三个不同表中选择行的查询: TableATableBTableC

我的查询的一个字段必须是每个表中字段Name 的串联,如以下别名:

SELECT
    A.Name,
    B.Name,
    C.Name,
    CONCAT(A.Name, ' / ', B.Name, ' / ', C.Name) AS Full_name
FROM ... 

查询使用LEFT OUTER JOIN 连接三个表。在某些情况下,如果其中一个表没有下表中的条目,我会得到奇怪的结果:

--------------------------
|Table A |Table B|Table C|
--------------------------
|My      |Name   |       |
--------------------------
|My      |       |Is     |
--------------------------
|My      |Name   |Is     |
--------------------------

尾随的 / 像这样可见:

1) My / Name /
2) My / / Is
3) My / Name / Is

我应该生成以下结果,但我不想使用 CASE,所以我想知道我是否可以同时使用 COALESCE、ISNULL 和 CONCAT

预期结果

1) My / Name
2) My / Is
3) My / Name / Is

【问题讨论】:

    标签: sql-server tsql string-concatenation concat


    【解决方案1】:

    添加'/'和名称时,如果名称为空,则为空。因此,您只需添加即可删除它们。

    试试这个:

    SELECT
        A.Name,
        B.Name,
        C.Name,
        CONCAT(A.Name, ' / '+ B.Name, ' / '+ C.Name) AS Full_name
    FROM 
    ...
    

    Fiddle 中的示例。

    【讨论】:

      【解决方案2】:

      我会采用的方法是:

      STUFF(CONCAT(' / ' + A.Name, ' / ' + B.Name, ' / ' + C.Name), 1, 3, '')
      

      前提是如果您的任何值是NULL,那么' / ' + NULL 也将为空,但是通过将' / ' 附加到所有内容的开头,那么您知道您将始终以/ 结尾开始,因此您可以使用 STUFF 函数安全地删除前 3 个字符。

      一个稍微扩展的例子是

      SELECT  *,
              [Concat] = STUFF(CONCAT(' / ' + A, ' / ' + B, ' / ' + C, ' / ' + D), 1, 3, '')
      FROM    (VALUES
                  ('A', 'B', NULL, 'D'),
                  ('A', NULL, 'C', NULL),
                  ('A', 'B', 'C', NULL),
                  ('A', 'B', 'C', 'D'),
                  ('A', NULL, NULL, 'D'),
                  (NULL, NULL, NULL, NULL),
                  (NULL, 'B', 'C', NULL)
              ) T (A, B, C, D);
      

      【讨论】:

      • 在第一个值可以为空的情况下,这比我的解决方案更好
      【解决方案3】:

      只是另一种方法:

      SELECT
          A.Name as AName,
          B.Name as BName,
          C.Name as CName,
          CONCAT(A.Name, 
                 CASE WHEN B.Name IS NOT NULL THEN ' / ' END, 
                 B.Name, CASE WHEN C.Name IS NOT NULL THEN ' / ' END,  
                 C.Name) AS Full_name
      FROM 
      ......
      

      结果:

      ANAME   BNAME   CNAME   FULL_NAME
      My      Name    (null)  My / Name
      My      (null)  Is      My / Is
      My      Name    Is      My / Name / Is
      

      SQL Fiddle 中的示例输出。

      【讨论】:

        猜你喜欢
        • 2010-09-29
        • 2014-10-25
        • 1970-01-01
        • 2013-06-16
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        相关资源
        最近更新 更多