2017-04-16 62 views
1

我有一些关于sql select语句的问题。 我有这个样子SQL SERVER从某个字符后选择字符串

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

我的问题是列值,我怎么能得到RIGHT的> 字符后的值,所以从价值选择上述声明将返回

4 
    30 
    410 
    5 

在此先感谢

+0

从哪里来'400'? –

+0

你的第三行不包含400,只有410.你想要第二个数字还是第二个数字(如第四个示例所示)?请更新问题以反映您的答案,我很乐意提供帮助。 –

+0

您的列还包含多个'>'字符。之后'''你需要获得价值吗? –

回答

1

如果需要second value from right,然后尝试:

对于SQL Server 10
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(your_column, '>', -2), '>', 1); 

EDIT

一种解决方案:

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) )) 
    )); 
+0

使用SQL Server 2014获得第二个值,当我执行查询时返回SUBSTRING_INDEX不是公认的内置函数名称。 – user3127287

+0

那你为什么把你的问题标记为mysql? –

+0

我的错误,对不起.. – user3127287

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),因为在那个阶段弦仍然颠倒。如果你需要转换成一个整数,通过在外部包装一个convert/cast来完成。

+0

这正是我所需要的,非常感谢你Steve.You救了我很多时间.. – user3127287

+0

upvote,呵呵,SQL服务器有很差的字符串功能 –

+0

Yep @OtoShavadze,有些东西在MySQL中更容易。虽然不是一切。例如没有窗口函数。我认为这是因为MySQL与Web技术紧密相关,所以它往往会有不同的功能驱动因素。 –

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