我在数据库中有这些条目。
最后的数字是版本,即10.0,9.1,9.0。我需要比较条目,我使用了像
这样的查询select * from Fault_Profile where PROFILE_NAME < 'DEFAULT_9.1';
但是这些条目像字符串一样被comapred,并返回10.0的值(我知道它是显而易见的)。
但有没有办法使用sql查询从字符串中提取数字并将其与数字进行比较。
注意:这是我项目中的旧设计无法更改架构无法更改值。
答案 0 :(得分:0)
您可以使用SUBSTR()然后重新输入DOUBLE
SELECT *
FROM Fault_Profile
WHERE SUBSTRING(PROFILE_NAME, 9) < 9.1;
答案 1 :(得分:0)
可能不是一个有效的,但您可以尝试下面的内容,这将只返回_
之后的部分。即,10.0,9.1,9.0
select
substring('Default_9.0',
locate('_','Default_9.0')+1,
(length('Default_9.0') - locate('_','Default_9.0')))
因此,根据您的查询,它应该是
select *
from Fault_Profile
where
substring(PROFILE_NAME,
locate('_',PROFILE_NAME)+1,
(length(PROFILE_NAME) - locate('_',PROFILE_NAME))) < 9.1
答案 2 :(得分:0)
SELECT *
FROM Fault_Profile
WHERE CAST(RIGHT(PROFILE_NAME, CHARACTER_LENGTH(PROFILE_NAME) - INSTR(PROFILE_NAME, '_')) AS DECIMAL(3,1)) < 9.1
ORDER BY CAST(RIGHT(PROFILE_NAME, CHARACTER_LENGTH(PROFILE_NAME) - INSTR(PROFILE_NAME, '_')) AS DECIMAL(3,1));
或者,如果你看起来更好(SQL Fiddle):
SELECT m.PROFILE_NAME, m.ALARM_CLASS FROM
(
SELECT *,
CAST(RIGHT(PROFILE_NAME, CHARACTER_LENGTH(PROFILE_NAME) - INSTR(PROFILE_NAME, '_')) AS DECIMAL(3,1)) AS version
FROM Fault_Profile f
) AS m
WHERE m.version < 9.1
ORDER BY m.version, m.ALARM_CLASS
上述查询确实假设_
之后的字符将是数字版本号。但是,您可以在_
前面拥有所需数量的字符。所以例如它仍然可以使用; Beta_9.0
和Production_10.1
。
答案 3 :(得分:0)
CREATE FUNCTION PROFILE_NAME_VERSION
(
-- Add the parameters for the function here
@PROFILE_NAME nvarchar(100)
)
RETURNS float
AS
BEGIN
-- Declare the return variable here
DECLARE @ResultVar float
SET @ResultVar=CAST(REPLACE(@PROFILE_NAME,'DEFAULT_','') as float)
RETURN @ResultVar
END
GO
select * from Fault_Profile where dbo.PROFILE_NAME_VERSION(PROFILE_NAME) < 9.1
替换函数参数的大小以匹配您的大小
答案 4 :(得分:0)
你也可以使用REPLACE
SELECT *
FROM Fault_Profile
where REPLACE(PROFILE_NAME, 'Default_','')*1 < 9.1