【问题标题】:Joining varchar and nvarchar加入 varchar 和 nvarchar
【发布时间】:2013-01-16 19:58:00
【问题描述】:

我正在比较两个不同数据库中的帐号,以确保两个数据库中都存在该帐号。一个数据库中的帐户字段是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 的帐户,但连接不起作用。我不确定是数据类型不匹配还是空格或其他原因。

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

【问题讨论】:

  • 您究竟需要什么帮助?
  • 连接两个表 table1 - accountnumber(nvarchar(255)) table2 - accountnumber(varchar(20)) select * from table1 left outer join table2 on table2.accountnumber = table1.accountnumber
  • 我们可以假设您使用的是 SQL Server 吗?
  • 尝试将第一列转换为 varchar(20)

标签: sql


【解决方案1】:

我遇到了完全相同的情况,我什至有 两个 同级查询(一个创建为另一个的副本),它们都有这个问题。排序规则和类型在这里没有问题。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      如果您的数据有空格,您可以根据您的 RDBMS 对数据进行 TRIM - SQL Server 的 LTRIM 和 RTRIM。

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

      这里是SQL Fiddle

      祝你好运。

      【讨论】:

      • 但是sql server执行计划会显示Type conversion可能会影响seek plan。那么如何处理。我的意思是优化查询。
      猜你喜欢
      • 2021-10-12
      • 2011-12-21
      • 2016-10-25
      • 2018-08-20
      • 1970-01-01
      • 2021-03-17
      • 2013-04-07
      • 2011-12-11
      相关资源
      最近更新 更多