2016-07-27 91 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