--方法0:动态SQL法declare @s varchar(100),@sql varchar(1000)set @s='1,2,3,4,5,6,7,8,9,10'set @sql='select col='''+ replace(@s,',',''' union all select ''')+''''PRINT @sqlexec (@sql)
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))drop function [dbo].[f_splitSTR]GO--方法1:循环截取法CREATE FUNCTION f_splitSTR(@s varchar(8000), --待分拆的字符串@split varchar(10) --数据分隔符)RETURNS @re TABLE(col varchar(100))ASBEGIN DECLARE @splitlen int SET @splitlen=LEN(@split+'a')-2 WHILE CHARINDEX(@split,@s)>0 BEGIN INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1)) SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'') END INSERT @re VALUES(@s) RETURNENDGO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))drop function [dbo].[f_splitSTR]GO--方法2:使用临时性分拆辅助表法CREATE FUNCTION f_splitSTR(@s varchar(8000), --待分拆的字符串@split varchar(10) --数据分隔符)RETURNS @re TABLE(col varchar(100))ASBEGIN --创建分拆处理的辅助表(用户定义函数中只能操作表变量) DECLARE @t TABLE(ID int IDENTITY,b bit) INSERT @t(b) SELECT TOP 8000 0 FROM syscolumns a,syscolumns b
INSERT @re SELECT SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID) FROM @t WHERE ID<=LEN(@s+'a') AND CHARINDEX(@split,@split+@s,ID)=ID RETURNENDGO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))drop function [dbo].[f_splitSTR]GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tb_splitSTR]') and objectproperty(id,N'IsUserTable')=1)drop table [dbo].[tb_splitSTR]GO--方法3:使用永久性分拆辅助表法--字符串分拆辅助表SELECT TOP 8000 ID=IDENTITY(int,1,1) INTO dbo.tb_splitSTRFROM syscolumns a,syscolumns bGO--字符串分拆处理函数CREATE FUNCTION f_splitSTR(@s varchar(8000), --待分拆的字符串@split varchar(10) --数据分隔符)RETURNS TABLEASRETURN( SELECT col=CAST(SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID) as varchar(100)) FROM tb_splitSTR WHERE ID<=LEN(@s+'a') AND CHARINDEX(@split,@split+@s,ID)=ID)GO
⑵ SQL 语句 将一个表中用特殊字符分割的字段转换成多行数据
不知道你是什么数据库,如果是Mysql,可以这样(假定含有qq字段的表为t1,另一张表为t2):
select `name` from `t2` where find_in_set(`id`, (select `nameid` from `t1` where `qq`=123));
如果是SQLServer,则这样:
select [name] from [t2] where charindex(','+[id]+',',','+(select [nameid] from [t1] where [qq]=123)+',')>0;
如果是ACCESS,则这样:
select [name] from [t2] where instr(',' & (select [nameid] from [t1] where [qq]=123) & ',',',' & [id] & ',')>0;
⑶ SQL语句实现拆分带间隔符号的字段
如果ID和内容是以空格分隔的,那么就这么写
select
left(m_content,charindex('
',m_content)-1)
as
ID,stuff(m_content,1,charindex('
',m_content),'')
as
content
from
表
当然,如果记录中有不完全按照id+空格+内容这样的,语句可能会有问题。
“向substring函数传递了无效的length参数”正是因为m_content中包含不符合樱察"id+空格+内容"的数山颂胡据
你可以用
select
*
from
表
where
m_content
not
like
'%
%'
or
m_content
is
null
来找出这样的行。
另外我给你的语句是让你逗拦做参考的,你首先知道用到的函数是什么意思才可以。
⑷ SQL 特定字符串分割
SETANSI_NULLSON
GO
SETQUOTED_IDENTIFIERON
GO
CREATEfunction[dbo].[SplitString]
(
@Inputnvarchar(max),
@Separatornvarchar(max)=',',
@RemoveEmptyEntriesbit=1
)
returns@TABLEtable
(
[Id]intidentity(1,1),
[Value]nvarchar(max)
)
as
begin
declare@Indexint,@Entrynvarchar(max)
set@Index=charindex(@Separator,@Input)
while(@Index>0)
begin
set@Entry=ltrim(rtrim(substring(@Input,1,@Index-1)))
if(@RemoveEmptyEntries=0)or(@RemoveEmptyEntries=1and@Entry<>'')
begin
insertinto@TABLE([Value])Values(@Entry)
end
set@Input=substring(@Input,@Index+datalength(@Separator)/2,len(@Input))
set@Index=charindex(@Separator,@Input)
end
set@Entry=ltrim(rtrim(@Input))
if(@RemoveEmptyEntries=0)or(@RemoveEmptyEntries=1and@Entry<>'')
begin
insertinto@TABLE([Value])Values(@Entry)
end
return
end
方法是其他地方找的
set@str1='1,2,3'
select[Value]from[dbo].[SplitString](@str1,',',1)
⑸ SQL语言如何将表内字符串按分割符号分割存储
用replace函数,将分号或者 @ 符号, 替换为你的其他分隔符。
REPLACE
用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式。
语法
REPLACE ( ''string_replace1'' , ''string_replace2'' , ''string_replace3'' )
参数
''string_replace1''
待搜索的字符串表达式。string_replace1 可以是字符数据或二进制数据。
''string_replace2''
待查找的字符串表达式。string_replace2 可以是字符数据或二进制数据。
''string_replace3''
替换用的字符串表达式。string_replace3 可以是字符数据或二进制数据。
返回类型
如果 string_replace(1、2 或 3)是支持的字符数据类型之一,则返回字符数据。如果 string_replace(1、2 或 3)是支持的 binary 数据类型之一,则返回二进制数据。
示例
下例用 xxx 替换 abcdefghi 中的字符串 cde。
SELECT REPLACE(''abcdefghicde'',''cde'',''xxx'')GO
下面是结果集:
------------abxxxfghixxx(1 row(s) affected)
⑹ SQL 特殊字符位置 之间的文本
可以创建一个函数,用来将字符串按分隔符号分隔成数据集,然后查询此数据集中的记录。函数如下:
createfunctiondbo.fv_split2(@txtnvarchar(4000),@spliternvarchar(10))
returns@tbtable(valnvarchar(100),idxintnotnullidentity(1,1))
as
begin
declare@idxint
set@idx=charindex(@spliter,@txt)
if@idx>0
begin
insertinto@tb(val)
selectleft(@txt,@idx-1)
set@txt=right(@txt,len(@txt)-@idx)
insertinto@tb(val)
selectval
fromdbo.fv_split2(@txt,@spliter)
end
else
begin
insertinto@tb(val)
select@txt
end
return
返回记录集中val为字符,idx为序号从1开始。
调用:
select*fromdbo.fv_split2('100.1*200.22*300.333*400.4444*500.55555*66*77','*')s
而你要取的特定记录则可以通过idx值指定。
⑺ sql如何根据隔符分割字符串
数据库自带的substring()、charindex()函数,可以根据需要截取字符串,但并不能实现分割
自己写分割函数,以下可以参考:
createfunctionGetStr
(
@strvarchar(1024),--要分割的字符串
@splitvarchar(10),--分隔符号
@indexint--取第几个元素
)
returnsvarchar(1024)
as
begin
declare@locationint
declare@startint
declare@nextint
declare@seedint
set@str=ltrim(rtrim(@str))
set@start=1
set@next=1
set@seed=len(@split)
set@location=charindex(@split,@str)
while@location<>0and@index>@next
begin
set@start=@location+@seed
set@location=charindex(@split,@str,@start)
set@next=@next+1
end
if@location=0select@location=len(@str)+1
returnsubstring(@str,@start,@location-@start)
end
⑻ sql 如何以逗号为分隔符分割一个字段的值
可用substring函数。
创建测试表及数据:
createtabletest
(idvarchar(10));
insertintotestvalues('123abc');
insertintotestvalues('456def');
insertintotestvalues('789ghi');
执行:
selectsubstring(id,1,3)+','+substring(id,4,3)asidfromtest
结果截图:
也就显示成了用逗号分隔的样子。
⑼ sql查询里 怎么拆分字符串(按“/”拆分)
先建立一个自定义函数,之个函数非常有用,建议收入自已的数据库
CREATE FUNCTION mysplit--将以某分隔符分段的字串,按指定的顺序号提取子串:
(@strnvarchar(2000),--源字串
@snint,--提取序号
@Delivarchar(1)--分隔符
)
RETURNSvarchar(100)
AS
BEGIN
declare@firstint,@lastint,@resultvarchar(1000),@sn0int
select@sn0=0,@first=0,@LAST=1,@str=@str+REPLICATE(@DELI,1)
while@sn0!=@sn
begin
select@sn0=@sn0+1,@first=@LAST,@last=charindex(@DELI,@str,@LAST)+1
end
if@last-@first-1<0
set@result=''
else
SET@RESULT=SUBSTRING(@str,@FIRST,@LAST-@FIRST-1)
RETURN(@RESULT)
END
查询方法:
DECLARE@AVARCHAR(100),@BVARCHAR(100),@CVARCHAR(100)
SELECT
@A=DBO.MYSPLIT('A|B|C',1,'|'),
@B=DBO.MYSPLIT('A|B|C',2,'|'),
@C=DBO.MYSPLIT('A|B|C',3,'|')
SELECT@A,@B,@C