想要字符串中char的位置

时间:2018-02-20 10:55:31

标签: sql sql-server sql-server-2008

我希望字符串中的数字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)

2 个答案:

答案 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.