我必须编写一个select查询,以根据位置从逗号分隔的列中获取值。当我说位置意味着逗号之间的每个值都被视为一个位置。
示例:
源表'alphabets'有一列,其值如下
column1的 ABC,DEFG,喜,J,KL,MNO,PQR,ST,U,V,WX,YZ
现在我必须在SQL Server 2012中选择第7个位置值'pqr'作为我的输出。
我已经提出了一致长度值的临时解决方案,但需要帮助来选择不一致的长度值。
在这种情况下,有人可以帮助我吗?
先谢谢!!
答案 0 :(得分:1)
你可以用逗号分隔字符串:
;WITH alphabets(s)AS(
SELECT 'abc,defg,hi,j,kl,mno,pqr,st,u,v,wx,yz'
)
SELECT l.* FROM alphabets AS a
CROSS APPLY(VALUES(CONVERT(XML,'<n>'+REPLACE(a.s,',','</n><n>')+'</n>')))c(x)
CROSS APPLY(SELECT ROW_NUMBER()OVER(ORDER BY GETDATE()) AS Pos,x.n.value('.','varchar(100)') AS ch FROM c.x.nodes('n')x(n)) l
Pos ch 1 abc 2 defg 3 hi 4 j 5 kl 6 mno 7 pqr 8 st 9 u 10 v 11 wx 12 yz
答案 1 :(得分:0)
我尝试了以下示例。它给出了第7行的位置。希望它能解决问题。
创建表#alphabets ( val varchar(100) ) 插入#alphabets 值 (&#39; ABC&#39), (&#39; DEFG&#39), (&#39;喜&#39), (&#39; J&#39), (&#39; KL&#39), (&#39; MNO&#39), (&#39; C&#39), (&#39; ST&#39), (&#39; U&#39), (&#39; V&#39), (&#39; WX&#39), (&#39; YZ&#39)
SELECT ROW_NUMBER()OVER(ORDER BY val)为ronumber,val为#temp1来自#alphabets
从#temp1中选择*,其中ronumber = 7