2017-04-16 63 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