Sql server 添加WHERE时SQL CONVERT不工作
使用:SQL Server 2008管理工作室,T-SQL 问题描述:我基本上有两个带有Sql server 添加WHERE时SQL CONVERT不工作,sql-server,tsql,numeric,varchar,Sql Server,Tsql,Numeric,Varchar,使用:SQL Server 2008管理工作室,T-SQL 问题描述:我基本上有两个带有AccountNumber列的表。在一个表中,它存储为NUMERIC,在另一个表中,它存储为VARCHAR(不幸的是,此数据类型差异无法更改) 因此,为了保持一致性,为了将它们都转换为数值数据类型,我尝试的解决方案是将VARCHAR表中的左连接,并将AccountNumber列转换为数值 这很好,查询将运行 但是,只要我向它添加WHERE子句,它就会崩溃,错误如下所示。如您所见,使用WHERE子句,我基本上只
AccountNumber
列的表。在一个表中,它存储为NUMERIC
,在另一个表中,它存储为VARCHAR
(不幸的是,此数据类型差异无法更改)
因此,为了保持一致性,为了将它们都转换为数值数据类型,我尝试的解决方案是将VARCHAR
表中的左连接
,并将AccountNumber
列转换为数值
这很好,查询将运行
但是,只要我向它添加WHERE
子句,它就会崩溃,错误如下所示。如您所见,使用WHERE
子句,我基本上只是对特定(NUMERIC
)AccountNumber
进行查询搜索
当左联接中的AccountNumber
列为数值时,为什么会出现此转换错误问题
/*
Assumptions:
A.AFIELD is numeric
B.BFIELD is varchar
Result:
Msg 8114, Level 16, State 5, Line 10
Error converting data type varchar to numeric.
*/
SELECT A.AccountNumber, B.AccountNumber
FROM A
LEFT JOIN
(SELECT CONVERT(NUMERIC, B.AccountNumber) AccountNumber
FROM B
WHERE ISNUMERIC(B.AccountNumber) = 1) B ON B.AccountNumber = A.AccountNumber
WHERE A.AccountNumber = 1234567890
/*NOTE: I am searching the originally numeric AccountNumber field for a numeric, yet it's erroring out*/
您应该执行到VARCHAR
的转换:
select A.AccountNumber, B.AccountNumber
from A
left join
(
select AccountNumber
from B
where ISNUMERIC(B.AccountNumber)=1
) B on B.AccountNumber = CONVERT(VARCHAR(10),A.AccountNumber)
where A.AccountNumber = 1234567890;
也许我的评论“它告诉你B中有一个不能转换成数字的值”不够清楚。试试这个:
select A.AccountNumber, B.AccountNumber
from A
left join
(
select CONVERT(numeric,B.AccountNumber) AccountNumber
from B
where ISNUMERIC(B.AccountNumber)=1
) B on coalesce(B.AccountNumber,0) = A.AccountNumber
where A.AccountNumber = 1234567890;
下面是一个简单的演示:
DECLARE @t1 TABLE
(
accountnumber NUMERIC
);
DECLARE @t2 TABLE
(
accountnumber VARCHAR(20)
);
INSERT @t1 ( [accountnumber] )
VALUES ( 1 ),
( 2 ),
( 3 );
INSERT @t2 ( [accountnumber] )
VALUES ( '1' ),
( '3' ),
( 'NonConvertible' );
SELECT A.accountnumber, B.accountNumber
FROM @t1 AS [A]
LEFT JOIN (
SELECT
CASE
-- Still not 100% safe because ISNUMERIC isn't
WHEN ISNUMERIC(B.accountnumber) = 1
THEN CONVERT(NUMERIC, accountnumber)
ELSE CONVERT(NUMERIC, NULL)
END AS accountNumber
FROM @t2 AS [B]
WHERE ISNUMERIC(accountNumber) = 1
-- ) B ON B.accountNumber = A.accountnumber
) B ON COALESCE(B.accountNumber, 0) = A.accountnumber
WHERE A.accountnumber = 1;
拉马克,谢谢你的回复。出于其他原因,最好将B转换为数字。基本上,这个查询将被抛出到Excel数据连接中,最终用户将把数字帐号列表放到Excel列中。VBA脚本会将它们全部循环在一起,并将它们放入查询的WHERE部分并返回结果。@Chase我不认为有问题,您可以在WHERE
Condition中将这些值用作数字抱歉-更详细地说,一些最终用户将使用数字,而另一些用户将使用VARCHAR(例如,“01234567890”)。这有点令人恼火,但这取决于他们从哪个记录系统获取帐号。因此,转换为数字将确保正确的结果,而转换为varchar可能会返回正确的结果。我想更根本的原因是我的查询出错?@Chase Lamak建议的转换仅用于我nWHERE
和ON
子句。输出(SELECT
列表)包括未转换的两列。因此,您可以使用任意内容进行导出。它告诉您B中有一个值无法转换为数字。case when is numeric()然后convert(numeric)结束
我真的想问下一个投票人,为什么?只是为了满足?我不是下一个投票人,但是什么让你认为这样可以防止错误发生?很简单,错误指向它:)这就是MS SQL server的工作方式。我觉得当人们不理解某些事情时,简单地否决投票是不礼貌的。我知道错误的意思,我只是说这并不能真正解决所有情况。例如,将'1e1'
添加到@t2
表中,然后查看是什么happens@Lamak是的,1e1将是一个问题,对于2008年,我想不出一个简单的解决方案。在2012年,您可以简单地使用带有TRY\u CONVERT(numeric,accountnumber)的原始查询