需要帮助在 SQL JOIN 中设置列​​值

Need help setting a column value in the SQL JOIN

我正在使用以下代码更新 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 语句中的所有条件都为真,则 x1 的值将为“1、2、3、4、5”,但我需要该值为“1、2、 3、4、5”。如何从 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

逗号不要放在末尾,放在开头,然后去掉第一个字符。在 SQL 服务器中删除第一个字符要容易得多,因为您可以使用 STUFF 将其删除 STUFF(<String Expression>,1,1,'')。因为你有一个逗号 (,) 和一个 space (' '),所以你需要删除 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

我会推荐 concat_ws():它在参数之间添加了分隔符,并且在 SQL 服务器中,具有忽略 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