【问题标题】:Concatenate a column only if its not NULL仅当列不为 NULL 时才连接列
【发布时间】:2017-03-14 16:54:10
【问题描述】:

我有一个这样的 SQL Server 表:

-------------------------------------------------------------------
PERSON
-------------------------------------------------------------------
   NAME   |   PHONE   |   PHONE1   |   PHONE2   |   PHONE_CONCAT  
-------------------------------------------------------------------
   Name1  |   12345   |   Null     |   Null     |   Null
   Name2  |   Null    |   54774    |   Null     |   Null
   Name3  |   Null    |   Null     |   77841    |   Null
-------------------------------------------------------------------

我想要做的是将 PHONE、PHONE1 和 PHONE2 列连接到 PHONE_CONCAT 中,仅当其中一列的值为 !=null 时。因此,在这种情况下,PHONE_CONCAT 列的最终值将是:

------------------
PERSON
------------------
   PHONE_CONCAT  
------------------
   12345
   54774
   77841
 ------------------

您能帮我执行此操作吗?

我想更新 PHONE_CONCAT 值,所以我需要对表中的每一行执行更新。

【问题讨论】:

  • 如果两列都有电话号码怎么办?
  • 我们的一个答案必须满足他的要求 :) @GordonLinoff。

标签: sql sql-server tsql sentence


【解决方案1】:

这是你想要的吗?

select coalesce(t.phone, t.phone1, t.phone2) as phone_concat
from t;

这将返回不是NULL第一个电话号码。这似乎是获得所需结果的最简单方法。

【讨论】:

  • IMO,这个答案比另一个更好,因为它支持数字类型;)。
  • @shA.t 。 . .电话号码不应存储为数字。这和 Sagi 之间的区别只是当单行中有多个值时 OP 的意图——而这个问题并不清楚。
  • 这实际上也不是 100% OP 想要的,因为即使有几列是 != NULL,它也会提供返回值 != NULL。或者至少这是他所要求的。
  • @Jens 。 . . OP 确实说“就在其中一列的值为 !=null 时”;但是,我不能 100% 确定这是实际意图。英语是一种棘手的语言,如果 2 个或更多列具有值,OP 似乎不太可能想要返回 NULL。绝对有可能,OP应该有更清晰的数据。
  • @GordonLinoff 虽然我同意这很可能是 OP 想要的,但假设他的英语不足以反映这一点并因此提供不同的解决方案有点侮辱。话虽如此,我确实赞成您的回答,因为我相信这是最好的方法。我并不是说你在这方面有过错。如果有的话,OP 在提出问题后没有澄清他的意图是有错的(并且在得到有用的答案后似乎永远不会回到 SO,即使只是为了标记解决方案)。
【解决方案2】:

作为一个选择语句:

SELECT COALESCE(t.phone,'') + COALESCE(t.phone1,'') + COALESCE(t.phone2,'') 
FROM PERSON t

或者如果你想更新它:

UPDATE PERSON t
SET t.PHONE_CONCAT = COALESCE(t.phone,'') + COALESCE(t.phone1,'') + COALESCE(t.phone2,'') 

【讨论】:

  • 当您可以将它们全部放入合并中时,为什么要先将它们全部转换为空字符串?此外,如果不止一列有数据,这会产生奇怪的结果。
  • 我是故意这样做的。我知道他想将所有NOT NULL 电话号码连接在一起。我认为他只是选择了一个糟糕的数据样本。 @DForck42。问题标题是Join two Columns into new column
  • 绝对不值得投反对票。这可能是 OP 想要的,尽管连接没有分隔符的电话号码对我来说没有意义。
  • 这不是 OP 想要的:“我想要做的是连接到 PHONE_CONCAT 列 PHONE、PHONE1 和 PHONE2 当这些列之一的值为 !=null ."
  • 很抱歉,但问题不完整,并且缺少一些必需的信息来确定 Gordon 或我的回答是否正确。 @詹斯
【解决方案3】:
WITH PERSON AS (
SELECT * FROM (VALUES
 ('Name1' , '12345' , Null , Null , Null),
 ('Name2' , Null , '54774' , Null , Null),
 ('Name2a', Null , '54774' , Null , '4356'),
 ('Name3' , Null , Null , '77841' , Null))
 s( NAME , PHONE , PHONE1 , PHONE2 , PHONE_CONCAT )) 
SELECT NAME ,TRIM(CONCAT( PHONE + ' ', PHONE1 + ' ', PHONE2 + ' ', PHONE_CONCAT)) FROM PERSON

将是:

NAME   
------ ----------------------
Name1  12345
Name2  54774
Name2a 54774 4356
Name3  77841

(4 rows affected)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 2023-03-19
    • 2018-09-08
    • 2021-08-16
    • 2016-10-19
    • 2020-09-02
    相关资源
    最近更新 更多