0

我有一个类似这样的字符串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。基本上我需要得到 2nd 和 3rd 之间的数字-

4

5 回答 5

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)
于 2014-03-20T12:48:15.387 回答
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
于 2014-03-20T12:46:48.540 回答
0

考虑使用正则表达式,因为我认为SQL Server 支持它们。您现在只需要知道如何通过 . 找到第二个和第三个 '-' 之间的数字regex

于 2014-03-20T12:47:16.797 回答
0

演示

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);
于 2014-03-20T12:53:11.593 回答
-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
于 2014-03-20T12:55:29.703 回答