2016-07-27 101 views
0

我有這個查詢我試圖讓工作,可以從字符串中提取十進制數,所以他們是他們自己的列。目標是然後比較值是訂購他們,所以他們也將需要轉換爲十進制(獲取數字的字符串是主要問題雖然)從字符串中選擇數字

我使用的示例是與字符串「 OrdRevenuePay 3200.00 - > 2836.07,OrdRate 3200.00 - > 2836.07「

我需要將每個字符串中的數字作爲自己的列。我到目前爲止能夠選擇第一個值,但第二個值也返回其他部分。這是查詢我一直使用至今:

DECLARE @str VARCHAR(128) 
SET @str = 'OrdRevenuePay 3200.00 -> 2836.07, OrdRate 3200.00 -> 2836.07' 
SELECT SUBSTRING(@str,CHARINDEX(' ',@str)+1,CHARINDEX('->',@str)-CHARINDEX(' ',@str)-1) as col1 
, SUBSTRING(@str,CHARINDEX('->',@str,1)+2,LEN(@str)-CHARINDEX(', OrdRate',@str,1)-1) as col2 
+0

請加樣輸出和輸入 – TheGameiswar

+0

有什麼可預測的關於輸入字符串,例如總是有四個十進制值,它們之間有某種標點符號,或者它可以是任何東西? – HABO

+0

這些值可以從4位(包括小數)到10位;字符串的格式總是相同的,I.E它始終以「OrdRevenuePay [number1] - > [number2],OrdRate [Number3] - > [Number4]」開頭。我希望每個數字都在自己的專欄中。最終目標是查詢只返回記錄,其中Number1大於Number2,而3大於Number4。 – samalkobi

回答

0
DECLARE @str VARCHAR(128) 
SET @str = 'OrdRevenuePay 3200.00 -> 2836.07, OrdRate 3200.00 -> 2836.07' 

; WITH ReplaceX 
    AS (
     SELECT REPLACE(REPLACE(LEFT(@str,CHARINDEX(',',@str)-1),' -> ','`'),' ','~') + '|' + 
     REPLACE(REPLACE(RIGHT(@str,LEN(@str) - CHARINDEX(',',@str) - 1),' -> ','}'),' ','{') + '^' AS NewString 
     ) 

SELECT SUBSTRING(NewString,CHARINDEX('~',NewString)+1,CHARINDEX('`',NewString)-CHARINDEX('~',NewString)-1), 
     SUBSTRING(NewString,CHARINDEX('`',NewString)+1,CHARINDEX('|',NewString)-CHARINDEX('`',NewString)-1), 
     SUBSTRING(NewString,CHARINDEX('{',NewString)+1,CHARINDEX('}',NewString)-CHARINDEX('{',NewString)-1), 
     SUBSTRING(NewString,CHARINDEX('}',NewString)+1,CHARINDEX('^',NewString)-CHARINDEX('}',NewString)-1) 
    FROM ReplaceX 
+0

這似乎很好!你能否確認我是否正確理解了這一點?在CTE中,你將用這些其他字符替換空格和其他字符(' - >',','),這樣你就可以用charindex更好地定義數字的位置以下子字符串? – samalkobi

+0

是的,這是正確的。我只是採取了可預測的事情,並使其更容易被識別。請注意,由於有多個空格和' - >',我基本上將字符串打斷了一半,因此我不必處理第一個和第二個外觀問題。 – DaveX