使用: SQL Server 2008 Management Studio,T-SQL
问题描述:我基本上有两个带有AccountNumber
列的表格。在一个表中,它存储为NUMERIC
,在另一个表中,它存储为VARCHAR
(遗憾的是,此数据类型差异无法更改)。
为了保持一致性,为了使它们都进入数值数据类型,我尝试的解决方案仅在LEFT JOIN
表中VARCHAR
转换为AccountNumber
列到NUMERIC
。
工作正常,查询将会运行。
但是,一旦我向它添加WHERE
子句,它就会崩溃并显示如下所示的错误。正如您所看到的,使用WHERE
子句,我实际上只是在查询特定的NUMERIC
} AccountNumber
。
当AccountNumber
出来的LEFT JOIN
列为NUMERIC
时,为什么会出现此转化错误?
/*
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*/
答案 0 :(得分:1)
您应该执行转换为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;
答案 1 :(得分:0)
也许我的评论,“它告诉你,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;