检索两个相同变量SQL之间的字符串

时间:2014-03-20 12:40:34

标签: sql sql-server substring charindex

我有一个像1234-56-7-8-9012这样的字符串。这可以是任何大小,-之间的值可以是任何大小。我需要在此字符串的中间提取7,但不能适应字符串的大小变化。这是我一直在使用的,但它不会改变大小:

@String = '1234-56-7-8-9012'

SUBSTRING(
        SUBSTRING(@String,CHARINDEX('-',@String)+1,LEN(@String))
        ,CHARINDEX('-'
            ,SUBSTRING(@String,CHARINDEX('-',@String)+1,LEN(@String))
        )+1
        ,1
    )

这将给出7值,但有时该值将为2。基本上我需要得到第2和第3 -之间的数字。

5 个答案:

答案 0 :(得分:1)

试试这个:

declare @String varchar(50) = '1234-56-7-8-9012'

select substring(@String, charindex('-',@String,charindex('-',@String,1)+1)+1,
    charindex('-',@String,charindex('-',@String,charindex('-',@String,1)+1)+1)-
    charindex('-',@String,charindex('-',@String,1)+1)-1)

答案 1 :(得分:0)

请尝试:

declare @String nvarchar(1000) = '1234-56-72-9012'
select 
    LEFT(y, CHARINDEX('-', y)-1)
from(
    select 
        RIGHT(x, LEN(x)-CHARINDEX('-', x)) y
    from(
        select RIGHT(@String, LEN(@String)-CHARINDEX('-', @String)) x
    )x1
)x2

答案 2 :(得分:0)

考虑使用正则表达式,因为我认为SQL Server support them。您现在所需要的只是知道如何通过regex找到第二个和第三个“ - ”之间的数字。

答案 3 :(得分:0)

DEMO

SELECT SUBSTRING(@String, 
                 CHARINDEX('-',@String,CHARINDEX('-',@String,1)+1)+1,
                 CHARINDEX('-',@String,CHARINDEX('-',@String,CHARINDEX('-',@String,1)+1)+1)- CHARINDEX('-',@String,CHARINDEX('-',@String,1)+1)-1);

答案 4 :(得分:-1)

试试这个......你可以在任何角色之间分割一个字符串(' Z'在这里)。

DECLARE @A TABLE (STRG VARCHAR (250)) 
INSERT INTO @A SELECT 'abcdZabcdefZabcdefghZabcdefghiZabccZaa';

WITH CTE(MOD_STR,STRG)
AS
(
SELECT CONVERT (VARCHAR(250),SUBSTRING(STRG,1,CHARINDEX('Z',STRG)-1))
,CONVERT (VARCHAR(250),SUBSTRING(STRG,CHARINDEX('Z',STRG)+1,LEN(STRG)-CHARINDEX('Z',STRG))) FROM @A
UNION ALL
SELECT CONVERT (VARCHAR(250),MOD_STR +';'+SUBSTRING(STRG,1,CASE WHEN CHARINDEX('Z',STRG)>1 THEN CHARINDEX('Z',STRG)-1 ELSE LEN(STRG) END))
,CONVERT (VARCHAR(250),SUBSTRING(STRG,CASE WHEN CHARINDEX('Z',STRG)>1 THEN CHARINDEX('Z',STRG)+1 ELSE 0 END
,CASE WHEN CHARINDEX('Z',STRG)>1 THEN LEN(STRG)-CHARINDEX('Z',STRG) ELSE 0 END))
FROM CTE WHERE LEN(STRG)<>0
)
SELECT * FROM CTE WHERE LEN(STRG)=0