sqlserver取数组中第N个值

请问下有啥简便点的sql写法去查出用逗号隔开的第1、2、3、4、5个值的?

如(0,1,1565636262008729602,1565638506548572162,1565640736269938689,1565874858712117249,)

第一个是0,第2个是1,第3个是1565636262008729602......

SQL 牛气冲天的哇 发布于 2023-3-16 12:07 (编辑于 2023-3-16 13:53)
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共3回答
最佳回答
0
Z4u3z1Lv6专家互助
发布于2023-3-16 15:15

if object_id('tb') is not null drop table tb 

go 

create table tb([编号] varchar(3),[产品] varchar(2),[数量] int,[单价] int,[金额] int,[序列号] varchar(8)) 

insert into tb([编号],[产品],[数量],[单价],[金额],[序列号]) 

select '001','AA',3,5,15,'12,13,14' union all

select '002','BB',8,9,13,'22,23,24'

go 

select [编号],[产品],[数量],[单价],[金额] 

,substring([序列号],b.number,charindex(',',[序列号]+',',b.number)-b.number) as [序列号] 

from tb a with(nolock),master..spt_values b with(nolock) 

where b.number>=1 and b.number<len(a.[序列号]) and b.type='P'

and substring(','+[序列号],number,1)=','

go 

drop table tb 

go 

image.png

最佳回答
0
3143511Lv5中级互助
发布于2023-3-16 13:24(编辑于 2023-3-16 13:26)

利用split()函数+纵向扩展+seq()辅助列+条件属性

1678944334796.png

最佳回答
0
梦似幻亦真Lv3见习互助
发布于2023-3-17 17:52

--创建函数

CREATEfunction [dbo].[Split_Str_Index](

@Str NVARCHAR(2000)='',--传入值

@Split NVARCHAR(50)='',--分割符

@Index INT=0)   --取第几位,从0开始

returns NVARCHAR(200)

as

begin

declare @i int=0,

@PrinStr nvarchar(200)=''

SET @Index =IIF(ISNULL(@Index,0)=0,0,@Index)

WHILE @Index>=@i

BEGIN

IF CHARINDEX(@Split,@Str)=0

BEGIN

SET @PrinStr = @Str

Break;

END

SET @PrinStr=LEFT(@Str,CHARINDEX(@Split,@Str)-1)

SET @Str = RIGHT(@Str,LEN(@Str)-CHARINDEX(@Split,@Str))

SET @i = @i+1 

END

return @PrinStr

end

案例:SELECT [dbo].[Split_Str_Index]('1,2,3,4,5,6',',',0)

  • 3关注人数
  • 468浏览人数
  • 最后回答于:2023-3-17 17:52
    请选择关闭问题的原因
    确定 取消
    返回顶部