在sqlserver中浮动值

时间:2013-07-24 14:35:42

标签: sql-server

我正在尝试比较2个varchar列 - col_1& COL_2,

col_1
A
A
A
1.0
2.0

col_2
A
A
A
1
2

我需要确保1.0& 1是相等的值,我不能将它们转换为整数,因为可能有有效值,如1.5 ...

任何提示?

Casting to float不会转换为1.0,仍然存储为1,

  select cast(v as float)from 
  (select 1 as v) tb1

4 个答案:

答案 0 :(得分:1)

这会解决您的问题吗?

Select CASE isnumeric(col_1)
    WHEN 1 THEN CAST(CAST(col_1 as DECIMAL(20,10)) as varchar(50))
    ELSE col_1
END

当您使用col_2加入时,对col_2应用相同的处理。在您的示例中,“A”将保留为“A”,两列中的“1”将为“1.0000000000”。

答案 1 :(得分:0)

您无法转换为整数,但可以转换为float。如果你仍然出于某种原因想要与小数位进行比较:

STR(col_1,LEN(col_1),1)

示例:

DECLARE @a varchar(10),
    @b varchar(25)
SET @a = '123.00'
SET @b = '000123.000'

SELECT 
CASE
    WHEN RTRIM(LTRIM(STR(@a,LEN(@a)+2,1))) = RTRIM(LTRIM(STR(@b,LEN(@b)+2,1))) THEN 1
    ELSE 0
END

否则坚持正常的CONVERT / CAST,因为此查询返回true:

SELECT 
CASE
    WHEN CAST('1.0' AS FLOAT) = CAST('1' AS FLOAT) THEN 1
    ELSE 0
END

答案 2 :(得分:0)

尝试这样的事情:

SELECT 'YES'
FROM sys.tables
WHERE CAST(1 as float) = 1.0

CAST语句可用于临时将您的Integer转换为Float。

答案 3 :(得分:0)

您可以将数值转换为float,然后返回varchar,这样您就可以比较varchar cols

观察:

CREATE TABLE #table_1 ( col_1 varchar(10), col_2 varchar(10) )

INSERT INTO #table_1 
SELECT 'A', 'A' UNION ALL
SELECT 'A', 'A' UNION ALL
SELECT 'A', 'A' UNION ALL
SELECT 'A', 'B' UNION ALL
SELECT '1.0', '1' UNION ALL
SELECT '1.2', '1' UNION ALL
SELECT '2.0', '2' UNION ALL
SELECT '2.2', '2.1'UNION ALL
SELECT '2.2', '2.0' 

SELECT 
    col_1, 
    col_2,
    CASE WHEN 
        CASE WHEN ISNUMERIC(col_1) = 1 
        THEN CAST( CAST( col_1 AS FLOAT ) AS VARCHAR(10) )
        ELSE col_1 
        END 
        = 
        CASE WHEN ISNUMERIC(col_2) = 1 
        THEN CAST( CAST( col_2 AS FLOAT ) AS VARCHAR(10) )
        ELSE col_2 
        END 
    THEN 'Equal' 
    ELSE 'Different' 
    END AS [comparison]
FROM #table_1

DROP TABLE #table_1