比较TSQL中不均匀长度的字符串

时间:2015-11-04 12:38:21

标签: sql sql-server tsql sql-server-2012 string-comparison

我有两张桌子。它们都包含(荷兰语)邮政编码。 那些格式为9999AA并存储为varchar(6)。 在左表中,代码是完整的

John Smith        1234AB
Drew BarryMore    3456HR
Ted Bundy         3456TX
Henrov            8995RE
My mother         8995XX

在右表中,代码可能不完整

1234AB Normal neigbourhood
3456   Bad neighbourhood
8995R  Very good neighbourhood

我需要在邮政编码上加入这些表格。在此示例中,输出必须是

John Smith        Normal neighbourhood
Drew BarryMore    Bad neighbourhood
Ted Bundy         Bad neighbourhood
Henrov            Very good neighbourhood
My mother         -unknown-

所以我必须根据右侧表中邮政编码的长度加入这两个表格。

有关如何执行此操作的任何建议吗?我只能在ON语句中提出一个CASE,但那不是那么聪明;)

4 个答案:

答案 0 :(得分:3)

如果第二个表格中没有“重复”,您可以使用like

select t1.*, t2.col2
from table1 t1 join
     table2 t2
     on t1.postalcode like t2.postalcode + '%';

然而,这不会有效。相反,table2(postalcode)和一系列left join的索引可能更快:

select t1.*, coalesce(t2a.col2, t2b.col2, t2c.col2) 
from table1 t1 left join
     table2 t2a
     on t2a.postalcode = t1.postalcode left join
     table2 t2b
     on t2b.postalcode = left(t1.postalcode, len(t1.postalcode) - 1) left join
     table2 t2c
     on t2c.postalcode = left(t1.postalcode, len(t1.postalcode) - 2) 

这可以利用table2(postalcode)上的索引。此外,它只会返回一行,即使table2中有多个匹配项,也会返回最佳匹配项。

答案 1 :(得分:2)

使用JOIN

<强>查询

SELECT t1.col1 as name,
       coalesce(t2.col2,'-unknown-') as col2
FROM table_1 t1
LEFT JOIN table_2 t2
ON t1.pcode LIKE t2.col1 + '%';

SQL Fiddle

答案 2 :(得分:1)

您可以使用:

on '1234AB' like '1234'+'%'

on firstTable.code like secondTable.code+'%'

在你加入搜索条件。

答案 3 :(得分:1)

您可以使用LEFT(column,4)

select t1.*, t2.col2
from table1 t1 join
     table2 t2
     on LEFT(t1.postalcode,4)=t2.postalcode