从sql字符串范围中获取一个数字

时间:2008-08-20 17:39:52

标签: sql-server

我有一列数据,其中包含一个百分比范围作为字符串,我想将其转换为数字,以便我可以轻松进行比较。

字符串中可能的值:

'<5%'
'5-10%'
'10-15%'
...
'95-100%'

我想在我的select where子句中将其转换为第一个数字,5,10,15等,以便我可以将该值与传入的“至少此”值进行比较。

我在子串,charindex,转换和替换上尝试了很多变种,但我似乎仍然无法获得适合所有组合的东西。

有什么想法吗?

8 个答案:

答案 0 :(得分:5)

试试这个,

SELECT substring(replace(interest , '<',''), patindex('%[0-9]%',replace(interest , '<','')), patindex('%[^0-9]%',replace(interest, '<',''))-1) FROM table1 

在我的测试结束后测试它是有效的,这只是我的第一次尝试,所以你可以优化它。

答案 1 :(得分:2)

@Martin:您的解决方案有效。

这是我根据@mercutio

的灵感想出的另一个
select cast(replace(replace(replace(interest,'<',''),'%',''),'-','.0') as numeric) test
from table1 where interest is not null

答案 2 :(得分:0)

您可以将char数据转换为其他类型的char(将char(10)转换为varchar(10)),但是您将无法将字符数据转换为SQL中的整数数据。

答案 3 :(得分:0)

我不知道这是否适用于SQL Server,但在MySQL中,您可以使用几个技巧将字符数据转换为数字。示例数据中的示例:

"<5%"     => 0
"5-10%"   => 5
"95-100%" => 95

现在很明显这会使你的第一次测试失败,但是字符串开头的一些聪明的字符串替换就足以让它工作了。

将字符数据转换为数字的一个示例:

SELECT "5-10%" + 0 AS foo ...

可能无法在SQL Server中运行,但未来的搜索可能会帮助奇怪的MySQL用户:-D

答案 4 :(得分:0)

<5%5-10%更改为在2个字段中存储2个值可能会好得多。您将存储0和5,而不是存储<5%,而不是5-10%,而是以5和10结束。最终会有2列,一列称为下限,另一列称为上限,然后只检查值>=下限和值<上限。

答案 5 :(得分:0)

您可以使用游标在sql server中执行此操作。如果您可以创建一个CLR函数来提取有用的数字分组。它可能在T-SQL中,只是丑陋。

创建光标以遍历列表。 找到第一个数字,如果他们只有一个数字组,那么返回它。否则找到第二项分组。

如果只返回第一个项目分组,则列表中的第一个项目将其设置为上限。 如果只返回第一个项目分组,则列表中的最后一个项目将其设置为下限。 否则将第1项分组设置为较低,将第2项分组设置为上限

只需将结果值设置回表格

即可

答案 6 :(得分:0)

您遇到的问题是不保持数据原子性的症状。在这种情况下,它看起来纯粹是无意的(遗产),但这里有一个link

要设计自己,请创建一个range_lookup表:

Create table rangeLookup(
    rangeID int  -- or rangeCD or not at all
    ,rangeLabel varchar(50)
    ,LowValue int--real or whatever
    ,HighValue int 
)

要在这里破解一些伪步骤,这将是一个深深嵌套的混乱。

normalize your input by replacing all your crazy charecters.
    replace(replace(rangeLabel,"%",""),"<","")
    --This will entail many nested replace statments.

Add a CASE and CHARINDEX to look for a space if there is none you have your number
    else use your substring to take everything before the first " ".
    -- theses steps are wrapped around the previous step.

答案 7 :(得分:0)

这很复杂,但对于您提供的测试用例,这是有效的。只需将@Test替换为您在表格中查找的列。

DECLARE @TEST varchar(10)

set @Test =  '<5%'
--set @Test =  '5-10%'
--set @Test =  '10-15%'
--set @Test =  '95-100%'

Select CASE WHEN 
Substring(@TEST,1,1) = '<' 
THEN 
0
ELSE 
CONVERT(integer,SUBSTRING(@TEST,1,CHARINDEX('-',@TEST)-1))
END
AS LowerBound
,
CASE WHEN 
Substring(@TEST,1,1) = '<'
THEN
CONVERT(integer,Substring(@TEST,2,CHARINDEX('%',@TEST)-2))
ELSE
CONVERT(integer,Substring(@TEST,CHARINDEX('-',@TEST)+1,CHARINDEX('%',@TEST)-CHARINDEX('-',@TEST)-1))
END
AS UpperBound