字符串截取问题,请教

finer 2017-09-19 04:09:48
高手们,表里有一字段内容如下,我要截取红线那部分数据,patindex的规则怎么写?谢谢

...全文
333 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
finer 2017-09-20
  • 打赏
  • 举报
回复
多谢大家! 解决了
RINK_1 2017-09-19
  • 打赏
  • 举报
回复


select SUBSTRING(COL,CHARINDEX(':',COL)+2,CHARINDEX(' ',REPLACE(COL,',',' '),CHARINDEX(':',COL)+2)-CHARINDEX(':',COL)-2)
听雨停了 2017-09-19
  • 打赏
  • 举报
回复

--创建一个查找字符串的函数
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 行受影响)

不知道这样行不行哈,就是截取第二个空格和第三个空格间的数据
二月十六 2017-09-19
  • 打赏
  • 举报
回复
--测试数据
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


听雨停了 2017-09-19
  • 打赏
  • 举报
回复
引用 楼主 finer 的回复:
高手们,表里有一字段内容如下,我要截取红线那部分数据,patindex的规则怎么写?谢谢
没看到你前面还有字符哈,你可以去第一个':'和第三个空格之间的数据不知道行不行
听雨停了 2017-09-19
  • 打赏
  • 举报
回复
我看你给出的数据,发现一个规律哈,不知道行不行哈。你可以试试哈。取第一个空格的位置前面的所有字符,然后把截取出来的字符后面有','号的去掉','号;然后就形成了你要的数据。就你给出的数据来看是可以得哈,至于你的真实数据行不行就不知道了。还有你这个用patindex的话好像不怎么太行啊,你这没什么规律,乱七八糟的
繁花尽流年 2017-09-19
  • 打赏
  • 举报
回复
引用 8 楼 leo_lesley 的回复:
[quote=引用 6 楼 zengertao 的回复:] [quote=引用 5 楼 finer 的回复:] [quote=引用 3 楼 zengertao 的回复:]
DECLARE @sql VARCHAR(MAX)='qwerty:1234-21365,12345274dsfst'


SELECT SUBSTRING(@sql,PATINDEX('%:%',@sql)+1,PATINDEX('%,%',@sql)-PATINDEX('%:%',@sql)-1)
参考下
划红线的字符后面有的有空格[/quote] 那自己再套着一层,如果多少长度内按逗号返回为0,则改用空格再套一层[/quote]

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了
leo_lesley 2017-09-19
  • 打赏
  • 举报
回复
引用 6 楼 zengertao 的回复:
[quote=引用 5 楼 finer 的回复:] [quote=引用 3 楼 zengertao 的回复:]
DECLARE @sql VARCHAR(MAX)='qwerty:1234-21365,12345274dsfst'


SELECT SUBSTRING(@sql,PATINDEX('%:%',@sql)+1,PATINDEX('%,%',@sql)-PATINDEX('%:%',@sql)-1)
参考下
划红线的字符后面有的有空格[/quote] 那自己再套着一层,如果多少长度内按逗号返回为0,则改用空格再套一层[/quote]

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 
繁花尽流年 2017-09-19
  • 打赏
  • 举报
回复
引用 5 楼 finer 的回复:
[quote=引用 3 楼 zengertao 的回复:]
DECLARE @sql VARCHAR(MAX)='qwerty:1234-21365,12345274dsfst'


SELECT SUBSTRING(@sql,PATINDEX('%:%',@sql)+1,PATINDEX('%,%',@sql)-PATINDEX('%:%',@sql)-1)
参考下
划红线的字符后面有的有空格[/quote] 那自己再套着一层,如果多少长度内按逗号返回为0,则改用空格再套一层
finer 2017-09-19
  • 打赏
  • 举报
回复
引用 3 楼 zengertao 的回复:
DECLARE @sql VARCHAR(MAX)='qwerty:1234-21365,12345274dsfst'


SELECT SUBSTRING(@sql,PATINDEX('%:%',@sql)+1,PATINDEX('%,%',@sql)-PATINDEX('%:%',@sql)-1)
参考下
划红线的字符后面有的有空格
finer 2017-09-19
  • 打赏
  • 举报
回复
前面的字符就是"DENSO:"或"MITSUBISHI:"
繁花尽流年 2017-09-19
  • 打赏
  • 举报
回复
DECLARE @sql VARCHAR(MAX)='qwerty:1234-21365,12345274dsfst'


SELECT SUBSTRING(@sql,PATINDEX('%:%',@sql)+1,PATINDEX('%,%',@sql)-PATINDEX('%:%',@sql)-1)
参考下

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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