SQL SERVER从某个字符后面选择字符串

时间:2017-04-16 09:31:39

标签: sql sql-server stored-procedures

我对sql select语句有一些问题。 我有一个看起来像这样的列值

    2>4>5 or
    28>30>52 or
    300>410>500 or
    2>4>5>8

我的问题是,如何在>之后从 RIGHT 获取值 字符,所以上面的值中的select语句将返回

    4
    30
    410
    5

提前致谢

3 个答案:

答案 0 :(得分:1)

如果您需要second value from right,请尝试:

SELECT SUBSTRING_INDEX( SUBSTRING_INDEX(your_column, '>', -2), '>', 1);

修改

sql server的一个解决方案:

DECLARE @str varchar(max);
set @str = '2>4>5>8';

SELECT reverse( substring(
    substring( reverse(@str),  charindex( '>', reverse(@str) )+1, len(@str)  ),  0, 
    charindex( '>', substring( reverse(@str),  charindex( '>', reverse(@str) )+1, len(@str)  ) ) 
    ) );

答案 1 :(得分:1)

这类似于从分隔字符串中提取第n个元素。唯一的区别是在这种情况下我们想要第n个到最后的元素。可以通过双重使用reverse来实现更改。假设该表格为MyTable且字段为MyColumn,则可以采用以下方式:

SELECT
    Reverse(
        CAST('<x>' + REPLACE(Reverse(MyColumn),'>','</x><x>') + '</x>' AS XML).value('/x[2]', --x[2] because it's the second element in the reversed string
        'varchar(5)' --Use something long enough to catch any number which might occur here
        ))
FROM
    MyTable

感谢@Shnugo在这里的努力:Using T-SQL, return nth delimited element from a string

你不能在int投放varchar(5),因为在那个阶段字符串仍然是反转的。foreach如果你需要转换为整数,可以通过在外部包装转换/强制转换来实现。

答案 2 :(得分:0)

;WITH cte1(Value)
AS
(
SELECT  '2>4>5'      Union all
SELECT  '28>30>52'     Union all
SELECT  '300>410>500'  Union all
SELECT  '2>4>5>8' 
)
SELECT 
SUBSTRING(
(
REVERSE(SUBSTRING(((REVERSE((SUBSTRING(Value, RIGHT(CHARINDEX('>', Value), Len(Value)) + 1, Len(Value)))))),
CHARINDEX('>',((REVERSE((SUBSTRING(Value, RIGHT(CHARINDEX('>', Value), Len(Value)) + 1, Len(Value)))))))+1,LEN(Value)))
),CHARINDEX('>',(
REVERSE(SUBSTRING(((REVERSE((SUBSTRING(Value, RIGHT(CHARINDEX('>', Value), Len(Value)) + 1, Len(Value)))))),
CHARINDEX('>',((REVERSE((SUBSTRING(Value, RIGHT(CHARINDEX('>', Value), Len(Value)) + 1, Len(Value)))))))+1,LEN(Value)))
))+1,LEN(Value))

 AS ExpectedValue
FROM cte1