我正在尝试比较 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
我正在尝试比较 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
这能解决你的问题吗?
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”。
您不能转换为整数,但可以转换为浮点数。如果您仍然出于某种原因想要与小数位进行比较,请执行以下操作:
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
尝试这样的事情:
SELECT 'YES'
FROM sys.tables
WHERE CAST(1 as float) = 1.0
该CAST
语句可用于临时将 Integer 转换为 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