SQL concat函数,结合大小和颜色

Posted

技术标签:

【中文标题】SQL concat函数,结合大小和颜色【英文标题】:SQL concat function, combine size and colour 【发布时间】:2022-01-24 04:09:53 【问题描述】:

如果有一个表叫variant

id             slug             slug_id
-------        ---------        ----------
1              s                 10
1              m                 10
1              l                 10
1              black             11
1              pink              11
1              ship_us           12
1              ship_uk           12
2              xl                10
2              xxl               10
2              blue              11
2              white             11

我需要这种格式的结果:

id             variant_slug
--------       ------------
1              1-s-black-ship_us
1              1-s-black-ship_uk
1              1-s-pink-ship_us
1              1-s-pink-ship_uk
1              1-m-black-ship_us
1              1-m-black-ship_uk
1              1-m-pink-ship_us
1              1-m-pink-ship_uk
1              1-l-black-ship_us
1              1-l-black-ship_uk
1              1-l-pink-ship_us
1              1-l-pink-ship_uk
2              2-xl-blue
2              2-xl-white
2              2-xxl-blue
2              2-xxl-white

问:这条记录在同一个变体表中。我几乎没有使用UDF,存储过程的经验,我需要通过查询来完成这件事。在不使用 UDF、SP 的情况下这是否可行。

【问题讨论】:

颜色的类型是固定的吗? 您的数据中似乎没有模式。你怎么知道哪些数据要连接到哪些数据? 该表中是否有另一列将slug 值标识为SizeColor 请向我们展示您的尝试并解释卡在哪里 请阅读this,了解一些改进问题的技巧。如果您无法解释如何将输入转换为(所需)输出,那么我们很难为您提供帮助。 【参考方案1】:

假设 size 的长度可能是自连接

Select A.ID
      ,variant_slug = concat(A.id,'-',A.slug,'-',B.slug)
 from  YourTable A
 Join  YourTable B 
   on A.ID=B.ID 
  and A.slug<>B.slug 
  and len(B.slug)>3 
  and len(A.slug)<=3

结果

ID  variant_slug
1   1-l-black
1   1-l-pink
1   1-m-black
1   1-m-pink
1   1-s-black
1   1-s-pink
2   2-xl-blue
2   2-xl-white
2   2-xxl-blue
2   2-xxl-white

而不是len(),您可以枚举大小,即NOT IN ('s','m','l','xl','xxl')

Select A.ID
      ,variant_slug = concat(A.id,'-',A.slug,'-',B.slug)
 from  YourTable A
 Join  YourTable B 
   on A.ID=B.ID 
  and A.slug<>B.slug 
  and B.slug NOT IN ('s','m','l','xl','xxl') 
  and A.slug IN ('s','m','l','xl','xxl')

【讨论】:

感谢您的帮助,但您似乎误解了我我的意思是如果数据是动态的,我们如何处理它我编辑了问题以便您更容易理解并为我的错误道歉【参考方案2】:

您可以通过将表分成两个单独的表来获取INNER JOINsizecolor 并获取变体数据,如下所示:

declare @slug table(id int, slug varchar(100))

insert into @slug values
(1,'s')
,(1,'m')
,(1,'l')
,(1,'black')
,(1,'pink')
,(2,'xl')
,(2,'xxl')
,(2,'blue')
,(2,'white');

SELECT size.id, CONCAT_WS('-',size.id,size.size, color.color) as variant_size
from (select id,slug as size from @slug where slug in ('s','m','l','xl','xxl') ) as size
INNER JOIN (select id,slug as color from @slug where slug NOT in ('s','m','l','xl','xxl') ) as COLOR
on color.id = size.id 
id variant_size
1 1-s-black
1 1-s-pink
1 1-m-black
1 1-m-pink
1 1-l-black
1 1-l-pink
2 2-xl-blue
2 2-xl-white
2 2-xxl-blue
2 2-xxl-white

【讨论】:

谢谢你的帮助,但是如果slug列中的属性比size、color多,但是上面2个id没有,怎么办?例如,添加一个运输属性例如 @SnTS,请将其作为单独的问题发布。修改问题,会给未来的读者带来困惑。如果您可以接受当前的解决方案,请将其标记为答案。因此,它将对网站的未来访问者有所帮助。 是的,我已经纠正了这个问题,非常抱歉我的错误

以上是关于SQL concat函数,结合大小和颜色的主要内容,如果未能解决你的问题,请参考以下文章

SQL报错注入总结

nginx concat module 安装和配置

SQL常用函数

mysql 多子查询 group_concat 查询

SQL---CONCAT系列函数

表连接多个 group_concat