比较数据库中的字符串

时间:2014-05-29 17:09:40

标签: mysql sql database

我在数据库中有这些条目。

enter image description here

最后的数字是版本,即10.0,9.1,9.0。我需要比较条目,我使用了像

这样的查询
select * from Fault_Profile where PROFILE_NAME < 'DEFAULT_9.1';

但是这些条目像字符串一样被comapred,并返回10.0的值(我知道它是显而易见的)。

但有没有办法使用sql查询从字符串中提取数字并将其与数字进行比较。

注意:这是我项目中的旧设计无法更改架构无法更改值。

5 个答案:

答案 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)

SQL Fiddle

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.0Production_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