2016-07-27 17 views
0

私はこの質問をしています私は自分の列であるように文字列から10進数を抽出できる作業をしようとしています。目標は、それらが順序であることを比較することですので、10進数に変換する必要があります(文字列の数字を取得することも主な問題です)。文字列から数字を選択

私が使用している例は、 OrdRevenuePay 3200.00 - > 2836.07、OrdRate 3200.00 - > 2836.07 "

それぞれの文字列をそれぞれの列として持つ必要があります。私がこれまでに持っているものは、最初の値を選択することができますが、2番目の値は他の部分も戻しています。例えば、

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

を追加してください入力された文字列についての予測可能なものはあります:これは私がこれまでに取り組んできましたクエリですそれらの間に何らかの種類の句読点を付けた4つの小数点の値が常にあるか、それとも何かになる可能性がありますか? – HABO

+0

値は、4桁(10進数を含む)〜10桁の範囲で指定できます。文字列の形式は常に同じです.IEは常に "OrdRevenuePay [number1] - > [number2]、OrdRate [Number3] - > [Number4]"で始まります。私はそれぞれの番号を自分の列にしたい。最終目標は、クエリがNumber1がNumber 2より大きく、Number 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

はい、正しいです。私は単に予測可能なものを取って、それを認識しやすくしました。複数の空白と ' - >'のために、私は本質的に半分の文字列を壊したので、最初と2番目の出現の問題に対処する必要はありません。 – DaveX

関連する問題