[英]SQL Server : Split a single column value comma seperated to multiple columns
[英]How to split a single column into multiple columns in SQL Server select statement?
我是SQL Server的新手。 我有一长列,名称以a,b,c和d开头。 我想在NameA,NameB,NameC和NameD的单独列中显示它们。 我试过工会,但它显示在一列中。 我尝试过案例,但我不知道如何使用它。 请帮忙。
现有栏
names
A1
B1
A2
C1
A3
A4
A_names| B_names | C_names
A1 | B1 | C1
A2
A3
A4
只是出于乐趣和好奇,为什么要这样:
select *
from
( select idx = left(names,1)
, names
, rn = row_number() over (partition by left(names,1) order by names)
from
( values ('A1'),('B1'),('A2'),('C1'),('A3'),('A4'),('B2'))
v(names)
) dat
pivot
( max(names)
for idx in ([A],[B],[C],[D])
) p
我认为这不是SQL应该解决的问题。 这是代表性的事情,应该在应用程序中完成。
但是,如果您坚持要为此使用SQL,则可以使用此方法。 此查询的主要问题是ROW_NUMBER函数的性能会很差。
WITH nameA
(
SELECT name, ROW_NUMBER() OVER(ORDER BY name) AS rn
FROM t1
WHERE name LIKE 'a%'
), nameB AS
(
SELECT name, ROW_NUMBER() OVER(ORDER BY name) AS rn
FROM t1
WHERE name LIKE 'b%'
)
SELECT name FROM nameA
FULL OUTER JOIN nameB
ON nameA.rn = nameB.rn
ORDER BY nameA.rn,nameB.rn;
您可以使用CASE( https://msdn.microsoft.com/en-us/library/ms181765.aspx )
此查询应工作:
SELECT
CASE WHEN users.name like 'a%' THEN users.name ELSE NULL END AS NameA,
CASE WHEN users.name like 'b%' THEN users.name ELSE NULL END AS NameB,
CASE WHEN users.name like 'c%' THEN users.name ELSE NULL END AS NameC,
CASE WHEN users.name like 'd%' THEN users.name ELSE NULL END AS NameD
FROM users
这并不是关系数据库的真正工作方式。 当数据在同一行中时,它应该以某种方式关联-至少是一个公共ID。 将名字刚好以A开头的人与名字刚好以B开头的人联系起来是什么? 为什么要让RDBMS建立这样的任意连接?
如果您需要以这种方式显示用户,则只想编写几个查询并让您的表示层处理正确的布局,例如
SELECT name FROM users WHERE name LIKE 'a%'
SELECT name FROM users WHERE name LIKE 'b%'
SELECT name FROM users WHERE name LIKE 'c%'
etc...
表示层可以运行每个查询,然后适当地填充表。 更好的是让表示层只运行以下查询:
SELECT name FROM users
然后适当地排序和显示数据,这可能比SQL Server对用户表的多次扫描便宜。
看这篇文章,它非常接近您的问题。 Itzik Ben-Gan | SQL Server专业版
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.