尽管数据相同但2个nvarchar字段不匹配?

时间:2015-06-15 12:23:30

标签: sql-server

我想在2列上使用Inner Join加入2个表,两个列都是(nvarchar, null)类型。 2列中包含相同的数据,但连接条件失败。我认为这是由于列值中包含的空格。

我已尝试LTRIMRTRIM

我的查询:

select 
    T1.Name1, T2.Name2
from 
    Table1 T1 
Inner Join 
    Table2 on T1.Name1 = T2.Name2  

我也尝试过这样:

on LTRIM(RTRIM(T1.Name1)) = LTRIM(RTRIM(T2.Name2))

我的数据:

Table1                  Table2
------                  ------
Name1(Column)           Name2(Column)           
-----                   ------              
Employee Data           Employee Data
Customer Data           Customer Data

当我使用

检查2个表格中的我的数据时

选择T1.Name1,len(T1.Name1)作为Length1,Datalength(T1.Name1)作为DataLenght1从Table1 T1

从表2 T2选择T2.Name2,len(T2.Name2)作为Length2,Datalength(T2.Name2)作为DataLenght2

结果是2个表的Length和DataLength值不同,对于2个表,它们不相同。

我无法更改2个表格中的原始数据。我该如何解决这个问题。

谢谢

3 个答案:

答案 0 :(得分:0)

联盟没有特殊的平等规则。相等运算符始终以相同的方式工作。因此,如果a = b,则a = b上的连接将起作用。因此,<>湾

检查这些字段的内容。虽然你认为它们不同,但它们不会是一样的:

select convert(varbinary(max), myCol) from T

Unicode具有不可见的字符(这似乎只会造成麻烦)。

答案 1 :(得分:0)

declare @t table (name varchar(20))
insert into @t(name)values ('Employee Data'),('Customer Data')

declare @tt table (name varchar(20))
insert into @tt(name)values ('EmployeeData'),('CustomerData')

select t.name,tt.name from @t t 
INNER  JOIN @tt tt
ON RTRIM(LTRIM(REPLACE(t.name,' ',''))) = RTRIM(LTRIM(REPLACE(tt.name,' ','')))

答案 2 :(得分:0)

我会遵循以下架构

  • 创建一个新表以存储所有可能的名称
  • 添加所需的键和索引
  • 使用现有名称填充
  • 将列添加到现有表中以存储名称的索引
  • 创建相对外键
  • 使用正确的索引填充新列
  • 创建过程以仅在值不存在的情况下在新表名称中执行插入
  • 使用新索引执行联接