区分大小写加入TSQL

时间:2016-05-03 15:50:58

标签: sql-server tsql join

我在这里有点停滞不前。我有一个简单的左外连接到一个返回ID的表。

我的代码是

Select distinct TenantID
,Name
,Name2
,TenantNumber
,Cashname 
From Tenants 
LEFT OUTER JOIN tCash 
on TenantNumber = CashNumber 
and tMoney.CashName = Tenants.Name2

我的结果集如下:

**TenantID | Name      | Name2          | TenantNo | CashName**

100      |MyShop     | John's shop    | 12345    |John's shop

999      |MyShop     | John's Shop    | 12345    |John's shop

我的问题:出于所有意图和目的,“John's shop”与“John's Shop”不同 - 我正在TenantNo上然后在Name2上加入我的钱桌,但是名字2是因案例而异。

问题: 有没有办法根据区分大小写来区分连接?我不想使用UPPERLOWER,因为它会破坏报告的情况。

谢谢!

在下面添加表信息,请假设所有列都被修剪为空格。

tMoney

CashNumnbr |  CashName
102504       Bill's Place     

102374       Tom's Shop      

12345        John's Shop

12345        John's shop

租户

   TenantID | Name     | Name2            |TenantNumber 

  1         |MyShop    | John's Shop     | 12345

  2         |MyShop    | John's shop     | 12345

  3         |Shoppee   |  Bill's Place   | 102504        

  4         | Shop2    | Toms Shop      | 102374        

由于我想加入以获取AR报告的正确TenantID,我想确保我始终引入正确的租户。如果情况不同,我能写些什么来区分像John's Shop这样的情况吗?

2 个答案:

答案 0 :(得分:9)

问题在于你的结果的第二行"约翰的 S 跳"不应该匹配"约翰的 s 跳"?

您可以使用区分大小写的排序规则。

这可能是通过更改所涉及的列的排序规则以允许使用索引来实现的,但您也可以在运行时使用明确的COLLATE子句来完成此操作。

SELECT DISTINCT TenantID,
                Name,
                Name2,
                TenantNumber,
                Cashname
FROM   Tenants
       LEFT OUTER JOIN tCash
         ON TenantNumber = CashNumber
            AND tMoney.CashName = Tenants.Name2 COLLATE Latin1_General_100_CS_AS 

关于加入id而不是名字的评论可能是正确的,并且根本不需要这样做。

答案 1 :(得分:0)

如果 COLLATE 由于缺乏索引而最终变得太慢,您还可以执行以下操作,其中每个下面的 30 必须匹配每列的长度以避免无效比较。

LEFT OUTER JOIN tCash ON 
    TenantNumber = CashNumber
    AND CONVERT(VARBINARY(30),LTRIM(RTRIM(tMoney.CashName))) = CONVERT(VARBINARY(30),LTRIM(RTRIM(Tenants.Name2)))