我希望字符串中的数字9后面的字符但是没有得到正确的输出。
declare @Col1 varchar(30)='39-0-9-6-17'
select SUBSTRING(@Col1, CHARINDEX('9', @Col1), (CHARINDEX('-', @Col1) + CHARINDEX('-', @Col1))-1)
select SUBSTRING(@Col1, CHARINDEX('9', CHARINDEX('9', @Col1, 1) ), (CHARINDEX('-', @Col1) + CHARINDEX('-', @Col1))-1)
答案 0 :(得分:2)
如果" 9"总是显示为" -9 - "在它之后的东西,而不是列表中的第一个元素,那么这将工作:
SELECT SUBSTRING(@Col1, PATINDEX('%-9-%', @col1) + 3, CHARINDEX('-', @Col1, PATINDEX('%-9-%', @col1) + 3) - (PATINDEX('%-9-%', @col1) + 3));
我想你会需要处理边缘情况吗?
您也可以使用它来略微缩短逻辑:
DECLARE @partial INT = PATINDEX('%-9-%', @col1) + 3;
SELECT SUBSTRING(@Col1, @partial, CHARINDEX('-', @Col1, @partial) - @partial);
处理字符串开始的情况" 9 - "然后这工作:
DECLARE @Col1 VARCHAR(30)='9-10-11';
DECLARE @partial INT = PATINDEX('%-9-%', @col1) + 3;
SELECT CASE WHEN LEFT(@Col1, 2) = '9-' THEN SUBSTRING(@Col1, 3, CHARINDEX('-', @Col1, 3) - 3)
ELSE SUBSTRING(@Col1, @partial, CHARINDEX('-', @Col1, @partial) - @partial) END;
最后一个边缘情况,其中-9-之后的数字是最终数字,所以没有" - "在它之后:
DECLARE @Col1 VARCHAR(30)='19-5-99-9-17';
DECLARE @partial INT = PATINDEX('%-9-%', @col1) + 3;
SELECT CASE WHEN LEFT(@Col1, 2) = '9-' THEN SUBSTRING(@Col1, 3, CHARINDEX('-', @Col1, 3) - 3)
ELSE SUBSTRING(@Col1, @partial, CASE WHEN CHARINDEX('-', @Col1, @partial) != 0 THEN CHARINDEX('-', @Col1, @partial) - @partial
ELSE LEN(@Col1) - @partial + 1 END) END;
是的,这是我最后的FINAL编辑,这是处理最后一个边缘的情况,其中有两个数字,第一个是9,所以" 9-1"例如:
DECLARE @Col1 VARCHAR(30)='5888-39-9';
DECLARE @partial INT = PATINDEX('%-9-%', @col1) + 3;
SELECT
CASE
WHEN RIGHT(@Col1, 2) = '-9' THEN NULL
WHEN LEFT(@Col1, 2) = '9-' THEN SUBSTRING(@Col1, 3,
CASE
WHEN CHARINDEX('-', @Col1, 3) != 0 THEN CHARINDEX('-', @Col1, 3) - 3
ELSE LEN(@Col1) - 2
END)
ELSE SUBSTRING(@Col1, @partial,
CASE
WHEN CHARINDEX('-', @Col1, @partial) != 0 THEN CHARINDEX('-', @Col1, @partial) - @partial
ELSE LEN(@Col1) - @partial + 1
END)
END;
答案 1 :(得分:2)
试试这个:
select @Col1,
SUBSTRING(@Col1,
CHARINDEX('-9-', @Col1) + 3,
charindex('-', @Col1, CHARINDEX('-9-', @Col1) + 3) - CHARINDEX('-9-', @Col1) - 3
)
它将在独立9之后返回下一个数字。例如:
'39-0-9-6-17' -> 6
'39-0-9-67-17' -> 67
'39-0-9-678-17' -> 678
为了涵盖案例,当9
位于开头时,查询会有点复杂:
select Col1, SUBSTRING(Col1, CHARINDEX([Nine], Col1) + len([Nine]),
charindex('-', Col1, CHARINDEX([Nine], Col1) + len([Nine])) -
CHARINDEX([Nine], @Col1) - len([Nine]))
from (
select @Col1 [Col1], case when @Col1 like '9[-]%' then '9-' else '-9-' end [Nine]
) a
它也将解决如下情况:
'9-17-5-23' -> 17
etc.