在TSQL中比较不同长度的字符串

3

我有两个表格。它们都包含(荷兰)邮政编码。这些编码的格式为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,但那并不太聪明 ;)


你说得很对,我已经编辑了。抱歉。看起来你比我更好地理解了这个问题 :) - Henrov
4个回答

4

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

SELECT t1.*, t2.col2
FROM table1 AS t1
JOIN table2 AS 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中有多个匹配项,它也只返回一行,返回最佳匹配项。


这就是我最终的实现方式。 - Henrov

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


1

您可以使用:

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

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

在你的连接搜索条件中。

1
有两个不同的表格。为了让它们正常工作,我应该先把它们连接起来,对吗? - Henrov

1
你可以使用 LEFT(column,4)
select t1.*, t2.col2
from table1 t1 join
     table2 t2
     on LEFT(t1.postalcode,4)=t2.postalcode

如果右列包含1234A,则1234不应该被命中,1234b也不应该被命中。如果只比较前4个数字,则存在这种风险。 - Henrov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接