在SQL Server中隔离列值
我有一个表,有两列(在SQL Server中隔离列值,sql,sql-server,tsql,split,Sql,Sql Server,Tsql,Split,我有一个表,有两列(Col1&Col2),值存储如下: Col1 Col2 A/B/C Red/Orange/Green D/E Red/Orange 我希望输出如下 Col1 Col2 A Red B Orange C Green D Red E Orange 不容易,但可行 我会通过“展平”桌子来做到: SELECT (l
Col1
&Col2
),值存储如下:
Col1 Col2
A/B/C Red/Orange/Green
D/E Red/Orange
我希望输出如下
Col1 Col2
A Red
B Orange
C Green
D Red
E Orange
不容易,但可行
我会通过“展平”桌子来做到:
SELECT (left bit of column 1), (left bit of column2)
UNION ALL
SELECT (middle bit of column 1), (middle bit of column 2)
where [column 1] like '%/%'
UNION ALL
SELECT (last bit of column 1), (last bit of column 2)
where [column 1] like '%/%/%'
如果可能会有更多的斜杠和数据,则需要添加更多的联合
使用CHARINDEX查找斜杠和子字符串以提取位。是否尝试了交叉应用?请将“您的表名”替换为表名。它应该可以工作,只是复制和粘贴
SELECT Col1, value AS Col2 INTO Table_2
FROM your_table_name
CROSS APPLY STRING_SPLIT(Col2, '/');
SELECT Col2, value AS Col1 INTO Table_3
FROM Table_2
CROSS APPLY STRING_SPLIT(Col1, '/');
SELECT * FROM Table_3;
也许“字符串拆分”能帮上忙?
请看示例D和E,不幸的是,SQL Server中内置的字符串拆分函数没有返回字符串中的位置。在我看来,这是一个重大的疏忽 假设字符串没有重复值,可以使用
row\u number()
和charindex()
添加枚举:
select t.*, ss.*
from t cross apply
(select s1.value as value1, s2.value as value2
from (select s1.value,
row_number() over (order by charindex('/' + s1.value + '/', '/' + t.col1 + '/')) as pos
from string_split(t.col1, '/') s1
) s1 join
(select s2.value,
row_number() over (order by charindex('/' + s2.value + '/', '/' + t.col2 + '/')) as pos
from string_split(t.col2, '/') s2
) s2
on s1.pos = s2.pos
) ss;
这是一个数据库文件。这是一个在SQL Server之外更容易处理的文件。考虑把你的数据模型固定到数据库中。我需要做的是SQL Server,这就提醒了我,为什么我非常喜欢PASGRES: <代码>从Tyx表交叉连接UNNEST(Trasythtoto数组(COL1,'/'),Strugtoto数组(COL2,'/'))作为T(C1,C2)< /代码>(SCNR),链接副本在我的眼中是不正确的…这个问题是关于至少拆分两个值并按其位置匹配项。这里的答案并没有真正的帮助…Shubham,哪个版本的SQL Server?好的,我想他/她想要Col2中对应于Col1的所有值。如果是关于匹配对,那么我的解决方案就不合适了。From:“输出行的顺序可能是任意的。顺序不能保证与输入字符串中的子字符串的顺序相匹配。”对于某些情况,也有4或5个值包含由/Yes分隔的值,只需复制并粘贴接头/选择并进行一些小的修改-原则是,我已经使用了20或30个接头,没有问题。不优雅,但它可以工作。From:“输出行可以是任意顺序。顺序不能保证与输入字符串中子字符串的顺序匹配。”