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
值标识为Size
或Color
?
请向我们展示您的尝试并解释卡在哪里
请阅读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 JOIN
:size
、color
并获取变体数据,如下所示:
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函数,结合大小和颜色的主要内容,如果未能解决你的问题,请参考以下文章