我正在尝试比较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
答案 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