22,210
社区成员
发帖
与我相关
我的任务
分享
select SUBSTRING(COL,CHARINDEX(':',COL)+2,CHARINDEX(' ',REPLACE(COL,',',' '),CHARINDEX(':',COL)+2)-CHARINDEX(':',COL)-2)
--创建一个查找字符串的函数
CREATE FUNCTION IndexOf(@str VARCHAR(500),@value VARCHAR(50),@posIndex INT)
RETURNS int AS
BEGIN
DECLARE @pos int=0 --记录位置
DECLARE @i INT =0 --记录查找的次数
WHILE(@i<@posindex)
BEGIN
SET @i=@i+1
set @pos=CHARINDEX(@value,@str,@pos+1)
IF(@pos=0) RETURN 0--如果没有找到就返回0,比如abcabc其中a中出现在2次@posIndex=3的话就返回0
END
RETURN @pos
END
DECLARE @str VARCHAR(MAX)='DENSO : 421000-0721, 421000-0722,'
SET @str= REPLACE(@str,' ','<>') --用<>替换里面的空格
PRINT @str
SELECT REPLACE(
SUBSTRING(
@str,
dbo.IndexOf(@str, '<>', 2) + 2,
dbo.IndexOf(@str, '<>', 3) -dbo.IndexOf(@str, '<>', 2) -2
),
',',
''
) --截取第二个空格到第三个空格之间的数据,如果最后截取到了,号的话就用''替换
DENSO<>:<>421000-0721,<>421000-0722,
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
421000-0721
(1 行受影响)
不知道这样行不行哈,就是截取第二个空格和第三个空格间的数据--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
CREATE TABLE #T(col NVARCHAR(100))
Insert #T
select N'DENSO:421-721,4201,' union all
select N'DENSO:421-721 HONDA:'
Go
--测试数据结束
SELECT SUBSTRING(col, CHARINDEX(':', col) + 1,
( CASE WHEN CHARINDEX(',', col) < CHARINDEX(' ', col)
AND CHARINDEX(',', col) <> 0
THEN CHARINDEX(',', col)
WHEN CHARINDEX(' ', col) < CHARINDEX(',', col)
AND CHARINDEX(' ', col) <> 0
THEN CHARINDEX(' ', col)
WHEN CHARINDEX(',', col) > CHARINDEX(' ', col)
AND CHARINDEX(' ', col) = 0
AND CHARINDEX(',', col) <> 0
THEN CHARINDEX(',', col)
WHEN CHARINDEX(' ', col) > CHARINDEX(',', col)
AND CHARINDEX(',', col) = 0
AND CHARINDEX(' ', col) <> 0
THEN CHARINDEX(' ', col)
ELSE CHARINDEX(',', col)
END ) - CHARINDEX(':', col) - 1)
FROM #T
DECLARE @sql VARCHAR(MAX)='qwerty:1234-21365 12345274dsfst'
-- 如果就这俩种区分方式可以用正则表达式处理的
SELECT SUBSTRING(@sql,PATINDEX('%:%',@sql)+1,PATINDEX('%[, ]%',@sql)-PATINDEX('%:%',@sql)-1)
where PATINDEX('%:%',@sql) > 0 and PATINDEX('%[, ]%',@sql) > 0
[/quote]
这种冒号后面多个空格就GG了
DECLARE @sql VARCHAR(MAX)='qwerty:1234-21365 12345274dsfst'
-- 如果就这俩种区分方式可以用正则表达式处理的
SELECT SUBSTRING(@sql,PATINDEX('%:%',@sql)+1,PATINDEX('%[, ]%',@sql)-PATINDEX('%:%',@sql)-1)
where PATINDEX('%:%',@sql) > 0 and PATINDEX('%[, ]%',@sql) > 0
DECLARE @sql VARCHAR(MAX)='qwerty:1234-21365,12345274dsfst'
SELECT SUBSTRING(@sql,PATINDEX('%:%',@sql)+1,PATINDEX('%,%',@sql)-PATINDEX('%:%',@sql)-1)
参考下