SQL写法

sql server 数据库 , 一列数据如下 1111111,22222,-333333

想将其按照逗号分开为多个数据,问sql 怎么写

FineReport BIGDATA 发布于 2024-3-26 09:18
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共4回答
最佳回答
0
JL98Lv6中级互助
发布于2024-3-26 09:22

在 SQL Server 中,你可以使用 STRING_SPLIT 函数来按照指定的分隔符(在你的例子中是逗号)来拆分字符串。但是,请注意,STRING_SPLIT 返回的是一个行集,其中每一行都包含拆分后的一个值。

以下是如何使用 STRING_SPLIT 函数来拆分你提供的字符串的示例:

sql

DECLARE @input NVARCHAR(MAX) = '1111111,22222,-333333';

SELECT value

FROM STRING_SPLIT(@input, ',');

这将返回以下结果:

diff

value

-------

1111111

22222

-333333

如果你有一个表,并且想要拆分该表中的某一列的数据,你可以这样做:

sql

SELECT value

FROM your_table_name

CROSS APPLY STRING_SPLIT(your_column_name, ',');

在这里,your_table_name 是你的表名,而 your_column_name 是你想要拆分的列名。

但是,请注意,STRING_SPLIT 返回的结果是一个行集,所以如果你想要将其插入到另一个表中或进行其他操作,你可能需要考虑如何处理这种行集结构。

  • BIGDATA BIGDATA(提问者) chat gpt也是这样说的,但是好像没办法执行,跑出来的结果显示STRING_SPLIT无效列名
    2024-03-26 09:25 
  • 七夜 七夜 回复 BIGDATA(提问者) 2016以上的版本有这个函数,可以考虑升级下数据库
    2024-03-26 10:04 
最佳回答
0
华莉星宸Lv6高级互助
发布于2024-3-26 09:28

最好是自己写一个函数来处理成多列

参考

https://blog.51cto.com/u_16213427/7339700

最佳回答
0
Z4u3z1Lv6专家互助
发布于2024-3-26 09:30

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

create table tb(id int identity(1,1),s nvarchar(100)) 

insert into tb(s) select '车位地址1,车位状况1|车位地址2,车位状况2|车位地址n,车位状况n'

;with cte as( 

select substring(s,number,charindex('|',s+'|',number)-number) as ss 

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

where type='P' and number>=1 and number<=len(s) 

and substring('|'+s,number,1)='|'

)select left(ss,charindex(',',ss)-1)as s1,substring(ss,charindex(',',ss)+1,len(ss))as s2 from cte 

drop table tb 

/** 

s1             s2 

----------- ------------ 

车位地址1      车位状况1 

车位地址2      车位状况2 

车位地址n      车位状况n 

*/

或者

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 

/** 

编号   产品   数量          单价          金额          序列号 

---- ---- ----------- ----------- ----------- -------- 

 AA   3           5           15          12 

 AA   3           5           15          13 

 AA   3           5           15          14 

 BB   8           9           13          22 

 BB   8           9           13          23 

 BB   8           9           13          24 

*/ 

---------- 

最佳回答
0
BrmiseLv6见习互助
发布于2024-3-26 09:32

sqlserver版本低于2016,就是使用

CREATE TABLE TestTable

(

 ID INT PRIMARY KEY

,NAME VARCHAR(MAX)

)

GO

INSERT INTO TestTable(ID, NAME)VALUES (1,'1111,2222,3333');

SELECT * FROM TestTable

--------------sqlserver低于2016------------

SELECT t.ID,s.Value As splitValue

FROM TestTable t

CROSS APPLY

(

SELECT Split.a.value('.','INT')AS Value 

FROM

(

SELECT CAST('<X>'+ REPLACE(t.NAME,',','</X><X>')+'</X>' AS XML)AS Data

)AS A

CROSS APPLY Data.nodes('X')As split(a)

)S;

--------------sqlserver为2016------------

SELECT t.ID,s.Value As splitValue

FROM TestTable t

CROSS APPLY STRING_SPLIT(t.NAME,',')S;

  • 4关注人数
  • 188浏览人数
  • 最后回答于:2024-3-26 09:32
    请选择关闭问题的原因
    确定 取消
    返回顶部