在某个字符之前仅选择整数

时间:2016-09-21 07:21:06

标签: sql-server

我想要一个简单的解决方案,只选择VARCHAR列右边的数字 在某个角色之前。

例如,在下面的字符串中,我只想在斜杠字符之前选择数字。数字有所不同,可以是1位数或更多。

'ST / 11 / SCI / 1 ''ST / 11 / SCI / 22 ''ST / 11 / BIO / 854 ''ST / 11 / BIO / 5421 '

5 个答案:

答案 0 :(得分:3)

您可以将REVERSECHARINDEX一起使用,以便找到最后'/'个字符的位置。然后使用RIGHT提取数字:

DECLARE @str VARCHAR(100) = 'ST/11/BIO/854'
SELECT RIGHT(@str, CHARINDEX('/', REVERSE(@str)) - 1)

修改

要从最后开始获得第二个数字,您可以使用:

DECLARE @str VARCHAR(100) = 'ST/11/BIO/1288/544'
SELECT SUBSTRING(@str, q2.x + 2, q2.x - q1.x - 1) 
FROM (SELECT @str AS v) AS t
CROSS APPLY (SELECT CHARINDEX('/', REVERSE(@str))) AS q1(x)
CROSS APPLY (SELECT CHARINDEX('/', REVERSE(@str), q1.x + 1)) AS q2(x)
CROSS APPLY (SELECT LEN(@str)) AS s(l)

答案 1 :(得分:2)

使用SUBSTRING, CHARINDEX, REVERSE

REVERSE: REVERSE原始字符串值

CHARINDEX:它会从字符串值中找到任何字符的索引/位置

SUBSTRING:它会拆分你的字符串值

DECLARE @myString as VARCHAR(50)='ST/11/SCI/22'
SELECT 
    REVERSE
    (
        SUBSTRING
        (
            REVERSE(@myString),
            0,
            CHARINDEX('/',REVERSE(@myString))
        )
    )

答案 2 :(得分:2)

我将此作为另一个答案,因为该方法与我的另一个答案完全不同:

从SQL Server 2012开始(thx @NEER!)有PARSENAME,这是将点分隔字符串最多分成4个部分的非常直接的方法:

DECLARE @stringTable TABLE(string VARCHAR(100));
INSERT INTO @stringTable VALUES
 ('ST/11/SCI/1'),('ST/11/SCI/22'),('ST/11/BIO/854'),('ST/11/BIO/5421');

SELECT  PARSENAME(REPLACE(s.string,'/','.'),1)
FROM @stringTable AS s

结果

1
22
854
5421

答案 3 :(得分:0)

如果您需要所有数据,可以轻松拆分并输入类型:

DECLARE @stringTable TABLE(string VARCHAR(100));
INSERT INTO @stringTable VALUES
 ('ST/11/SCI/1'),('ST/11/SCI/22'),('ST/11/BIO/854'),('ST/11/BIO/5421');

SELECT s.string
      ,x.value('/x[1]','nvarchar(10)') AS Part1
      ,x.value('/x[2]','int') AS Part2
      ,x.value('/x[3]','nvarchar(10)') AS Part3
      ,x.value('/x[4]','int') AS Part4
FROM @stringTable AS s
CROSS APPLY(SELECT CAST('<x>' + REPLACE(s.string,'/','</x><x>')+'</x>' AS XML)) AS A(x)

结果

string          Part1   Part2   Part3   Part4
ST/11/SCI/1     ST      11      SCI     1
ST/11/SCI/22    ST      11      SCI     22
ST/11/BIO/854   ST      11      BIO     854
ST/11/BIO/5421  ST      11      BIO     5421

答案 4 :(得分:0)

您可以结合使用reversecharindex

select reverse(left(reverse(...), charindex('/', reverse(...)) -1))

反向文档:https://msdn.microsoft.com/fr-fr/library/ms180040.aspx

charindex的文档:https://msdn.microsoft.com/fr-fr/library/ms186323.aspx

测试:select reverse(left(reverse('ST/11/SCI/2'), charindex('/', reverse('ST/11/SCI/2')) -1))

输出:2

注意:我们不知道您的SQL-Server版本,请查看reverse / charindex文档以了解支持哪种版本的SQL Server!