我在SQL表中有两列如下。我需要比较这两列不匹配,但由于额外的小数,我得到错误的结果。当我尝试转换第一列时,它会给出错误
“将数据类型varchar转换为数字时出错。”
如何解决这个问题?第一列的长度各不相同。
Column01(varchar) Column02(Decimal)
0.01 0.010000
0.255 0.255000
答案 0 :(得分:5)
您的Column01
数据无法投放到DECIMAL
。
使用 SQL Server 2012+
,我会使用 TRY_PARSE
:
SELECT *
FROM your_table
WHERE Column02 = TRY_PARSE(Column01 AS DECIMAL(38,18));
的 LiveDemo
强>
如果无法安全地投放列中的值,则会获得NULL
。
对于 SQL Server 2008
,您可以使用:
SELECT *
FROM #tab
WHERE (CASE
WHEN ISNUMERIC(Column01) = 1 THEN CAST(Column01 AS DECIMAL(38,18))
ELSE NULL
END) = Column02;
修改强>
如果您需要在列级别使用:
SELECT Column01, Column02,
CASE WHEN Column02 = TRY_PARSE(Column01 AS DECIMAL(38,18))
OR (Column02 IS NULL AND Column01 IS NULL)
THEN 'true'
ELSE 'false'
END AS [IsEqual]
FROM #tab;
的 LiveDemo2
强>
答案 1 :(得分:1)
您可以使用自我加入和转换功能
来执行此操作SELECT x.Column01, y.Column02
FROM table1 x, table1 y
WHERE x.Column02 = try_parse(y.Column01 as decimal(38,18))
由于我无法发表评论,我要感谢lad2025展示现场演示并介绍data.stackexchange以撰写查询
答案 2 :(得分:0)
另一种方法:
create table #temp(col1 varchar(10),col2 decimal(10,6))
insert into #temp values(0.01,0.010000 ),(0.255,0.255000),(0.25,25),(0.555,10.0)
select * from #temp where REPLACE(REPLACE(col2,col1,''),0,'') = ''
select * from #temp where REPLACE(REPLACE(col2,col1,''),0,'') <> ''