sql拆分逗号分割的字符串并对结果加引号

stevenjin 2018-10-09 04:53:30
一个字符串为"a,b,c"
要求ms sql分解为:'a','b','c'
...全文
1186 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2018-10-10
  • 打赏
  • 举报
回复
引用 9 楼 stevenjin 的回复:
群举真是我的偶像呀,我这样也跑成功了
declare @A varchar(100)='生菜,b,c'

Update [ItemInfo] set [ItemName]='结球生菜1' WHERE [ItemName] IN(
    select item FROM [dbo].[Fun_String2ToStringArray](@A,',')
)
比如: 1.RETURNS @table TABLE ([item] NVARCHAR(max)),这里是先声明一个TABLE吗? 2. select item FROM [dbo].[Fun_String2ToStringArray](@A,','),这里的item可以看作是调用时要传入的字段值吗? 3.FROM @xml.nodes('/x') t(c)) t,这里的‘t(c)’是什么意思?
1. 表值函数分两种:内联表值函数和多语句表值函数。这个是多语句表值函数的做法, 你也可以这么理解吧。 2. select item from [dbo].[Fun_String2ToStringArray](@A,',') 查询表值函数, 相当于查询一个表 item 是表值函数中定义好的字段名。 @A 才是传入参数。 3. t(c) => Table(Column) 。 你现在要理解还不太容易, 也不需要, 知道这个函数怎么用就行了吧。
stevenjin 2018-10-10
  • 打赏
  • 举报
回复
谢谢指点
stevenjin 2018-10-09
  • 打赏
  • 举报
回复
以上特别是第3点,觉得很纳闷,望群主解答一下
stevenjin 2018-10-09
  • 打赏
  • 举报
回复
群举真是我的偶像呀,我这样也跑成功了
declare @A varchar(100)='生菜,b,c'

Update [ItemInfo] set [ItemName]='结球生菜1' WHERE [ItemName] IN(
select item FROM [dbo].[Fun_String2ToStringArray](@A,',')
)


比如:
1.RETURNS @table TABLE ([item] NVARCHAR(max)),这里是先声明一个TABLE吗?
2. select item FROM [dbo].[Fun_String2ToStringArray](@A,','),这里的item可以看作是调用时要传入的字段值吗?
3.FROM @xml.nodes('/x') t(c)) t,这里的‘t(c)’是什么意思?
吉普赛的歌 2018-10-09
  • 打赏
  • 举报
回复
你误解了 ' 的作用, 也不清楚表值函数的用途。
单引号只是用来界定字符串常量的, 对于已经是字符串的对象, 比如:字符串变量、字符串类型的字段、表变量中的字符串类型字段等都不需要你再加单引号了, 那是画蛇添足, 反而得不到正确结果。

USE tempdb
GO
IF OBJECT_ID('test') IS NOT NULL DROP TABLE test
GO
CREATE TABLE test(
ItemName NVARCHAR(20)
)
GO
SET NOCOUNT ON
INSERT INTO test VALUES ('a')
INSERT INTO test VALUES ('b')
INSERT INTO test VALUES ('c')
INSERT INTO test VALUES ('d')
GO
--1. 以上为测试表和测试数据

--2. 添加表值函数
IF OBJECT_ID('[dbo].[Fun_String2ToStringArray]') IS NOT NULL
DROP FUNCTION [dbo].[Fun_String2ToStringArray]
GO
CREATE FUNCTION [dbo].[Fun_String2ToStringArray](@str NVARCHAR(MAX), @split NVARCHAR(10))
RETURNS @table TABLE ([item] NVARCHAR(max))
AS
BEGIN
IF LEN(@split) = 0
BEGIN
SET @split = N','
END

DECLARE @xml XML;
SET @xml = CONVERT(XML, '<x><![CDATA[' + replace(CONVERT(VARCHAR(MAX), @str), @split, ']]></x><x><![CDATA[') + ']]></x>')

INSERT INTO @table
SELECT item
FROM (SELECT c.value('text()[1]', 'nvarchar(4000)') [item]
FROM @xml.nodes('/x') t(c)) t
WHERE item IS NOT NULL

RETURN
END
GO

--3. 查询
--3.1 用表值函数得到结果:
SELECT * FROM test WHERE [ItemName] IN(
select item FROM [dbo].[Fun_String2ToStringArray]('a,b,c',',')
)

--3.2 用 like 得到结果:
SELECT * FROM test WHERE ','+'a,b,c'+',' LIKE '%,'+ItemName+',%'




RINK_1 2018-10-09
  • 打赏
  • 举报
回复
引用 6 楼 stevenjin 的回复:
[quote=引用 4 楼 RINK_1 的回复:]

declare @A varchar(100)

set @A='"a,b,c"'

select ''''+replace(replace(@A,'"',''),',',''',''')+''''
你这个更厉害啊,不过我代进去,没有查到数据。填死的是可以查到的。
SELECT * FROM [dbo].[ItemInfo] WHERE [ItemName] IN(select ''''+replace(replace(@A,'"',''),',',''',''')+'''')
[/quote] 用动态语句试试。

declare @A varchar(100)
declare @sql varchar(1000)

set @A='"a,b,c"'
set @sql='SELECT * FROM [dbo].[ItemInfo] WHERE [ItemName] IN ('''+replace(replace(@A,'"',''),',',''',''')+''')'

exec(@sql)
stevenjin 2018-10-09
  • 打赏
  • 举报
回复
引用 4 楼 RINK_1 的回复:

declare @A varchar(100)

set @A='"a,b,c"'

select ''''+replace(replace(@A,'"',''),',',''',''')+''''


你这个更厉害啊,不过我代进去,没有查到数据。填死的是可以查到的。
SELECT * FROM [dbo].[ItemInfo] WHERE [ItemName] IN(select ''''+replace(replace(@A,'"',''),',',''',''')+'''')
stevenjin 2018-10-09
  • 打赏
  • 举报
回复
能具体点吗,基础太差呀,十分感谢
RINK_1 2018-10-09
  • 打赏
  • 举报
回复

declare @A varchar(100)

set @A='"a,b,c"'

select ''''+replace(replace(@A,'"',''),',',''',''')+''''
zbdzjx 2018-10-09
  • 打赏
  • 举报
回复
,替换成','
"替换成'
应该就可以了吧。
stevenjin 2018-10-09
  • 打赏
  • 举报
回复
中间的逗号没有呢,大师。要像这样:'a','b','c'
吉普赛的歌 2018-10-09
  • 打赏
  • 举报
回复
--添加表值函数
IF OBJECT_ID('[dbo].[Fun_String2ToStringArray]') IS NOT NULL 
	DROP FUNCTION [dbo].[Fun_String2ToStringArray]
GO
CREATE FUNCTION [dbo].[Fun_String2ToStringArray](@str NVARCHAR(MAX), @split NVARCHAR(10))
RETURNS @table TABLE ([item] NVARCHAR(max))
AS
BEGIN
    IF LEN(@split) = 0
      BEGIN
        SET @split = N','
      END
 
    DECLARE @xml XML;
    SET @xml = CONVERT(XML, '<x><![CDATA[' + replace(CONVERT(VARCHAR(MAX), @str), @split, ']]></x><x><![CDATA[') + ']]></x>')
 
    INSERT INTO @table
      SELECT item
      FROM   (SELECT c.value('text()[1]', 'nvarchar(4000)') [item]
              FROM   @xml.nodes('/x') t(c)) t
      WHERE  item IS NOT NULL
 
    RETURN
END
GO

--查询
SELECT ''''+item+'''' AS r FROM  [dbo].[Fun_String2ToStringArray]('a,b,c',',')
/*
r
----
'a'
'b'
'c'
*/

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧