【问题标题】:How to remove the whitespace while concatenating while some have Null values?如何在连接时删除空格,而有些具有 Null 值?
【发布时间】:2017-12-14 08:25:39
【问题描述】:

我正在尝试连接玩家的名字,其中一些玩家没有中间名。在如下连接时,我为没有中间名的玩家获得了一个空白空间,并且逻辑对于有中间名的玩家来说很好。如何单独删除 NULL 值列的不需要的空格?

我只想要连接表达式中中间名的首字母。

SELECT m_playerid, first_name + ' ' + SUBSTRING (coalesce (middle_
name, ' '), 1,1) + ' ' + last_name as [Full name]
, game as Game, inns as Innings, [scores] as Scores FROM  odsports

我不应该引入一个条件来删除 NULL 的空格?我被击中了!

【问题讨论】:

    标签: sql-server sql-server-2016 string-concatenation


    【解决方案1】:

    您可以利用NULL+ 运算符连接到任何东西产生NULLCONCAT 函数将NULL 转换为空字符串这一事实。

    所以CONCAT(first_name, ' ', LEFT(middle_name,1) + ' ', last_name) 将根据需要处理空中间名 - 如下例所示

    WITH T(first_name, middle_name, last_name) AS
    (
    SELECT 'Franklin', 'Delano', 'Roosevelt' union all
    SELECT 'Barack', NULL, 'Obama'
    )
    SELECT CONCAT(first_name, ' ', LEFT(middle_name,1) + ' ', last_name)
    FROM T
    

    返回

    +----------------------+
    |   (No column name)   |
    +----------------------+
    | Franklin D Roosevelt |
    | Barack Obama         |
    +----------------------+
    

    【讨论】:

      【解决方案2】:

      为双空格添加替换,以及使用 isnull 函数。试试这个

      SELECT 
      m_playerid, 
      REPLACE(
      LTRIM(RTRIM(ISNULL(first_name ,'')))
      +CASE WHEN middle_name IS NULL
              THEN ' '
          ELSE ' '+LEFT(ISNULL(middle_name,' '),1)+' ' END
      +
      LTRIM(RTRIM(ISNULL(last_name,'')))
      ,'  ',' ') as [Full name],
      game as Game, 
      inns as Innings, 
      [scores] as Scores 
      FROM  odsports
      

      【讨论】:

      • 额外的空格仍然存在!!!我们只需要名称的每个部分之间有 1 个空格。感谢您建议姓氏为 NULL 值的条件,在我们的例子中,名字和姓氏不能为空。
      • @C82 那么名字和姓氏可能有尾随空格。我已经更新了答案,试试吧
      • 在“ISDATE”附近的预期条件的上下文中指定的非布尔类型表达式。 @Martin Smith 的回答解决了这个问题。它很瘦。
      【解决方案3】:

      试试这个:

      SELECT  m_playerid,
          COALESCE(first_name + ' ' + middle_name + ' ' + last_name,
                   first_name + ' ' + last_name,
                   first_name,
                   last_name) as [Full name],
          game as Game, 
          inns as Innings, 
          [scores] as Scores
      FROM odsports
      

      【讨论】:

        【解决方案4】:
        SELECT 
           m_playerid, 
           LTRIM(CONCAT(first_name,Space(1),LTRIM(RTRIM(middle_name+space(1)+last_name)))) 
                                                                                 as [Full name],
           game as Game,
           inns as Innings, 
           [scores] as Scores 
        FROM  odsports
        

        【讨论】:

        • 它只为中间名为空的玩家提供名字。
        • 你执行查询了吗?即使名字为空,它也会删除空格
        • 是的,我做到了!但还是一样。 @Martin Smith 的回答解决了它。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-15
        • 2011-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多