【问题标题】:Need help setting a column value in the SQL JOIN需要帮助在 SQL JOIN 中设置列​​值
【发布时间】:2021-03-16 23:29:34
【问题描述】:

我正在使用下面的代码来更新 SQL JOIN 语句中的列值。

   CASE when SUBSTRING(m.x1,1,1) = 1 then '1, ' else '' END
   + CASE when SUBSTRING(m.x1,2,1) = 1 then '2, ' else '' END
   + CASE when SUBSTRING(m.x1,3,1) = 1 then '3, ' else '' END
   + CASE when SUBSTRING(m.x1,4,1) = 1 then '4, ' else '' END
   + CASE when SUBSTRING(m.x1,5,1) = 1 then '5, ' else ''
   END                               AS    "x1",

例如,如果上述 CASE 语句中的所有条件都为 TRUE,则 x1 的值将为“1, 2, 3, 4, 5”,但我需要该值为“1, 2, 3, 4、5"。如何从 JOIN 本身的字符串中删除最后一个“逗号分隔符”。

提前谢谢你!

【问题讨论】:

    标签: sql sql-server string case inner-join


    【解决方案1】:

    不要把逗号放在最后,把它放在开头,然后去掉第一个字符。在 SQL Server 中删除第一个字符要容易得多,因为您可以使用 STUFF 删除它 STUFF(<String Expression>,1,1,'')。因为你有一个逗号(,)和一个空格(' '),那么你需要删除2个字符,而不是1个。你也可以使用CONCAT来删除ELSE ''

    SELECT STUFF(CONCAT(CASE SUBSTRING(m.x1,1,1) WHEN 1 then ', 1' END,
                        CASE SUBSTRING(m.x1,2,1) WHEN 1 then ', 2' END,
                        CASE SUBSTRING(m.x1,3,1) WHEN 1 then ', 3' END,
                        CASE SUBSTRING(m.x1,4,1) WHEN 1 then ', 4' END,
                        CASE SUBSTRING(m.x1,5,1) WHEN 1 then ', 5' END),1,2,'') AS x1
    

    如果您使用的是更新版本的 SQL,则可以改用 CONCAT_WS

    SELECT CONCAT_WS(' ,',CASE SUBSTRING(m.x1,1,1) WHEN 1 then '1' END,
                          CASE SUBSTRING(m.x1,2,1) WHEN 1 then '2' END,
                          CASE SUBSTRING(m.x1,3,1) WHEN 1 then '3' END,
                          CASE SUBSTRING(m.x1,4,1) WHEN 1 then '4' END,
                          CASE SUBSTRING(m.x1,5,1) WHEN 1 then '5' END) AS x1
    

    【讨论】:

    • 感谢您帮助我! STUFF 和 CONCAT 解决方案对我有用。我无法验证 CONCAT_WS,因为我的版本不支持它。
    • 如果它回答了问题,请mark it as the solution,@Tely。
    【解决方案2】:

    我会推荐concat_ws():它在其参数之间添加分隔符,并且在SQL Server 中,具有忽略null 值的好特性;通过避免 else 分支到 case 表达式的需要,这进一步简化了代码。

    concat_ws (',',
        case when substring(m.x1,1,1) = 1 then '1' end,
        case when substring(m.x1,2,1) = 1 then '2' end,
        case when substring(m.x1,3,1) = 1 then '3' end,
        case when substring(m.x1,4,1) = 1 then '4' end,
        case when substring(m.x1,5,1) = 1 then '5' end,
    ) as x1
    

    【讨论】:

      【解决方案3】:

      改成

      CASE when SUBSTRING(m.x1,1,1) = 1 then '1, ' else '' END
         + CASE when SUBSTRING(m.x1,2,1) = 1 then '2, ' else '' END
         + CASE when SUBSTRING(m.x1,3,1) = 1 then '3, ' else '' END
         + CASE when SUBSTRING(m.x1,4,1) = 1 then '4, ' else '' END
         + CASE when SUBSTRING(m.x1,5,1) = 1 then '5' else ''
         END                               AS    "x1
      

      【讨论】:

      • 但 5 个案例中的任何一个都可能是真的。所以我想是否有办法从查询本身的字符串中删除最后一个字符。
      猜你喜欢
      • 2023-01-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多