我有一列数据,其中包含百分比范围作为字符串,我想将其转换为数字,以便进行轻松比较。
字符串中的可能值:
'<5%'
'5-10%'
'10-15%'
...
'95-100%'
我想在我的 select where 子句中将它转换为第一个数字,5、10、15 等,以便我可以将该值与传入的“至少这个”值进行比较。
我在 substring、charindex、convert 和 replace 上尝试了一堆变体,但我似乎仍然无法得到适用于所有组合的东西。
有任何想法吗?
我有一列数据,其中包含百分比范围作为字符串,我想将其转换为数字,以便进行轻松比较。
字符串中的可能值:
'<5%'
'5-10%'
'10-15%'
...
'95-100%'
我想在我的 select where 子句中将它转换为第一个数字,5、10、15 等,以便我可以将该值与传入的“至少这个”值进行比较。
我在 substring、charindex、convert 和 replace 上尝试了一堆变体,但我似乎仍然无法得到适用于所有组合的东西。
有任何想法吗?
试试这个,
SELECT substring(replace(interest , '<',''), patindex('%[0-9]%',replace(interest , '<','')), patindex('%[^0-9]%',replace(interest, '<',''))-1) FROM table1
经过我的测试,它可以工作,这只是我的第一次尝试,所以你可以优化它。
@Martin:您的解决方案有效。
这是我根据@mercutio 的灵感提出的另一个
select cast(replace(replace(replace(interest,'<',''),'%',''),'-','.0') as numeric) test
from table1 where interest is not null
您可以将 char 数据转换为其他类型的 char(将 char(10) 转换为 varchar(10)),但您无法在 SQL 中将字符数据转换为整数数据。
我不知道这是否适用于 SQL Server,但在 MySQL 中,您可以使用几种技巧将字符数据转换为数字。您的示例数据中的示例:
"<5%" => 0
"5-10%" => 5
"95-100%" => 95
现在显然这无法通过您的第一次测试,但是在字符串开头进行一些巧妙的字符串替换就足以使其正常工作。
将字符数据转换为数字的一个示例:
SELECT "5-10%" + 0 AS foo ...
可能在 SQL Server 中不起作用,但未来的搜索可能会帮助奇怪的 MySQL 用户:-D
<5%
更改并5-10%
在 2 个字段中存储 2 个值可能会更好。不是storage <5%
,而是存储 0 和 5,而不是5-10%
,最终会得到 5 和 10。最终会得到 2 列,一列称为下界,一列称为上界,然后只需检查值>=
下界和值<
上限。
您可以使用游标在 sql server 中执行此操作。如果您可以创建一个 CLR 函数来提取数字分组,这将有所帮助。它在 T-SQL 中是可能的,只是会很丑。
创建光标以循环遍历列表。找到第一个数字,如果他们中只有一个数字组,则返回它。否则找到第二个项目分组。
如果仅返回第一个项目分组,并且列表中的第一项将其设置为上限。如果仅返回第一个项目分组,并且列表中的最后一项将其设置为下限。否则将第一个项目分组设置为下限,将第二个项目分组设置为上限
只需将结果值设置回表格
您遇到的问题是不保持数据原子性的症状。在这种情况下,它看起来纯粹是无意的(旧版),但这里有一个关于它的链接。
为了设计你自己,创建一个 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.
这很复杂,但是对于您提供的测试用例,这是可行的。只需将 @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