【问题标题】:SQL Server : concat valuesSQL Server:连接值
【发布时间】:2018-12-13 19:53:29
【问题描述】:

我有 3 列 SPRTELE_PHONE_AREASPRTELE_PHONE_NUMBERSPRTELE_PHONE_EXT - 前缀、数字和分机。

我创建了一个案例,如果 SPRTELE_PHONE_AREASPRTELE_PHONE_EXT 为空,我只想显示 SPRTELE_PHONE_NUMBER。否则,如果它们不为空,则输出将是带有括号和点的“(prefix)number.ext”。

这是我的代码:

SELECT
    CASE
        WHEN SPRTELE_PHONE_AREA IS NULL AND SPRTELE_PHONE_EXT IS NULL 
           THEN SPRTELE_PHONE_NUMBER
           ELSE CONCAT('(', SPRTELE_PHONE_AREA, ')', SPRTELE_PHONE_NUMBER, '.', SPRTELE_PHONE_EXT)
    END
FROM 
    vcc.sprtele;

问题是输出显示为每条记录的第二种情况:“CONCAT...”

问题出在哪里?

示例:前缀 = 650,数字 = 1234567,分机 = 890

  • 如果前缀和分机为空 -> 1234567
  • 如果前缀和分机不为空 -> (650)1234567.890

如果 prefix 为 null 而 ext 不为 null -> 1234567.890 反之亦然

【问题讨论】:

  • 样本数据和期望的结果可以很好地传达您想要做的事情。
  • 如果其中一个为NULL而另一个不是,你想做什么?
  • 你确定它们是空的吗?也许他们只是空白?在这种情况下,coalesce(SPRTELE_PHONE_AREA ,'') <> '' 可能就是您想要的。
  • 听起来你有三个按降序排列的选项,如果它们中的任何一个为空,请跳过它。 COALESCE 的绝佳机会(step1, step2, step 3, '')

标签: sql sql-server concatenation


【解决方案1】:

您的查询缺少 2 种情况:
如果前缀为空且 ext 不为空
如果 ext 为空且前缀不为空

SELECT
  CASE
    WHEN SPRTELE_PHONE_AREA IS NULL AND SPRTELE_PHONE_EXT IS NULL THEN SPRTELE_PHONE_NUMBER
    WHEN SPRTELE_PHONE_AREA IS NULL THEN CONCAT(SPRTELE_PHONE_NUMBER, '.', SPRTELE_PHONE_EXT)
    WHEN SPRTELE_PHONE_EXT IS NULL THEN CONCAT('(', SPRTELE_PHONE_AREA, ')', SPRTELE_PHONE_NUMBER)
    ELSE CONCAT('(', SPRTELE_PHONE_AREA, ')', SPRTELE_PHONE_NUMBER, '.', SPRTELE_PHONE_EXT)
  END
FROM vcc.sprtele;

【讨论】:

    【解决方案2】:

    这个怎么样:

    COALESCE(CONCAT('(', SPRTELE_PHONE_AREA, ')', SPRTELE_PHONE_NUMBER, '.', SPRTELE_PHONE_EXT)
            ,CONCAT('(', SPRTELE_PHONE_AREA, ')', SPRTELE_PHONE_NUMBER
            ,CONCAT( SPRTELE_PHONE_NUMBER, '.', SPRTELE_PHONE_EXT)
            ,SPRTELE_PHONE_NUMBER,'')
    

    COALESCE 取第一个非空值。

    【讨论】:

    • 这不是你想要的吗?
    • 我已经编辑了我的帖子,并附上了一个关于我希望输出如何的示例
    • @mecnism 再次更新。你应该可以从这里拿走它
    • 非常感谢
    【解决方案3】:

    给你

    CREATE TABLE T(
      Prefix VARCHAR(20),
      Num VARCHAR(20),
      Ext VARCHAR(20)
    );
    
    INSERT INTO T VALUES
    ('1', '11', '111'),
    (NULL, '22', '222'),
    ('3', '33', NULL),
    (NULL, '44', NULL);
    
    SELECT CONCAT( IIF(Prefix IS NULL, '', CONCAT('(', Prefix, ')')),
                   Num,
                   IIF(Ext IS NULL, '', CONCAT('.', Ext))
                 ) Results
    FROM T
    

    返回:

    +-----------+
    |  Results  |
    +-----------+
    | (1)11.111 |
    | 22.222    |
    | (3)33     |
    | 44        |
    +-----------+
    

    【讨论】:

      【解决方案4】:

      这里的关键是将格式字符(括号和句点)连接到 ISNULL() 函数中的字段值:

      ;WITH Data AS (
          SELECT  1 AS ExampleNumber,
                  '555' AS Prefix,
                  '1234567' AS PhoneNumber,
                  '999' AS Extension
          UNION
          SELECT  2 AS ExampleNumber,
                  NULL AS Prefix,
                  '1234567' AS PhoneNumber,
                  '999' AS Extension
          UNION
          SELECT  3 AS ExampleNumber,
                  '555' AS Prefix,
                  '1234567' AS PhoneNumber,
                  NULL AS Extension
      )
      
      SELECT      ISNULL('(' + d.Prefix + ')', '')
                      + ISNULL(d.PhoneNumber, '')
                      + ISNULL('.' + d.Extension, '')
      FROM        Data d
      ORDER BY    d.ExampleNumber
      

      结果是:

      (555)1234567.999
      1234567.999
      (555)1234567
      

      此方法也可用于连接,例如,地址 1、地址 2 和地址 3 没有间隙,如果连接回车 + 换行,用于多行地址输出。

      【讨论】:

        猜你喜欢
        • 2013-07-22
        • 2015-03-26
        • 2019-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-24
        • 2015-01-14
        • 2016-11-22
        相关资源
        最近更新 更多