我对sql select语句有一些问题。 我有一个看起来像这样的列值
2>4>5 or
28>30>52 or
300>410>500 or
2>4>5>8
我的问题是,如何在>之后从 RIGHT 获取值 字符,所以上面的值中的select语句将返回
4
30
410
5
提前致谢
答案 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