0

我正在尝试比较 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 这样的有效值......

有小费吗?

转换为浮点数不会转换为 1.0,它仍然存储为 1,

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

4 回答 4

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”。

于 2013-07-24T14:59:36.280 回答
0

您不能转换为整数,但可以转换为浮点数。如果您仍然出于某种原因想要与小数位进行比较,请执行以下操作:

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
于 2013-07-24T14:42:33.760 回答
0

尝试这样的事情:

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

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

于 2013-07-24T14:43:06.040 回答
0

您可以将数值转换为浮点数,然后再转换为 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
于 2013-07-24T15:17:30.120 回答