加入varchar和nvarchar

时间:2013-02-01 13:32:09

标签: sql

我正在比较两个不同数据库中的帐号,以确保帐户同时存在。一个数据库中的帐户字段为nvarchar,另一个数据库为varchar。我做一个演员将它们都投射到varchar(12)并加入它们以查看没有匹配的地方。如果帐号少于12个字符,则认为不匹配。我假设每个字段中的额外字符都会导致问题?

table1 - accountnumber(nvarchar(255))
table2 - accountnumber(varchar(20))

select * from
table1
left outer join table2 on table2.accountnumber = table1.accountnumber

在这个示例中,两个表都有一个编号为12345678的帐户,但是联接不起作用。我不确定它是否是数据类型不匹配或空格或其他内容。

- Added-- 我应该补充一点,table2中的数据实际上来自一个Oracle数据库,它存储为varchar2(12字节)。我将它导入SQL Server数据库,并将其存储为varchar(20)。我不确定这是否有所作为。

3 个答案:

答案 0 :(得分:1)

不确定您遇到问题的地方。此查询应返回匹配的帐号(无需CAST):

SELECT *
FROM YourTable 
   JOIN YourOtherTable ON YourTable.AccountNumber = YourOtherTable.AccountNumber

如果您的数据有空格,您可以根据您的RDBMS - LTRIM和RTRIM for SQL Server来修剪数据。

SELECT *
FROM YourTable 
   JOIN YourOtherTable ON RTRIM(LTRIM(YourTable.AccountNumber)) = RTRIM(LTRIM(YourOtherTable.AccountNumber))

这是SQL Fiddle

祝你好运。

答案 1 :(得分:1)

您的查询工作正常。这可能是字符编码问题。尝试使用collate。请参阅this之前的SO回答,这可能有所帮助。

答案 2 :(得分:0)

我遇到了完全相同的情况,我甚至有两个兄弟查询(一个创建为另一个的副本),这两个都有这个问题。整理和类型在这里没有问题。

最后经过大量测试后,其中一个查询开始工作而没有明显的变化,只是重写了。当我重新输入第二个查询的IN部分时,它也开始工作了。 因此,在查询中的某处意外输入了隐藏字符时出现问题。