鉴于我有两个表-路线和国家/地区代码。
表路由包含我要与表country_codes列prefix
中找到的最长值匹配的列code
目标是找到每条路线的国家/地区名称。
我拥有的数据结构
CREATE TABLE routes(
prefix INTEGER NOT NULL,
supplier VARCHAR(64) NOT NULL
);
餐桌路线
prefix supplier
1876 att
1787 att
1 att
81 bt
8150 bt
8170 bt
8180 bt
8190 bt
82 verizon
821 verizon
84 att
84120 att
84121 att
84122 att
84123 att
84124 att
84125 att
85248 verizon
85249 verizon
85251 verizon
CREATE TABLE country_codes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
country VARCHAR(128) DEFAULT 0 NOT NULL,
code INTEGER
);
表格国家/地区代码
167 American Samoa 1684
170 Anguilla 1264
173 Antigua and Barbuda 1268
181 Bahamas 1242
184 Barbados 1246
189 Bermuda 1441
195 British Virgin Islands 1284
205 Cayman Islands 1345
225 Dominica 1767
226 Dominican Republic 1809
227 Dominican Republic 1829
228 Dominican Republic 1849
251 Grenada 1473
253 Guam 1671
273 Jamaica 1876
310 Montserrat 1664
326 Northern Mariana Islands 1670
340 Puerto Rico 1787
341 Puerto Rico 1939
350 Saint Kitts and Nevis 1869
351 Saint Lucia 1758
354 Saint Vincent and the Grenadines 1784
364 Sint Maarten 1721
389 Trinidad and Tobago 1868
393 Turks and Caicos Islands 1649
399 United States 1
401 US Virgin Islands 1340
274 Japan 81
370 South Korea 82
405 Vietnam 84
201 Cambodia 855
261 Hong Kong 852
282 Laos 856
291 Macau 853
325 North Korea 850
所以我想查询表routes
来给我结果前缀,国家
我正在寻找的结果
prefix country
1876 Jamaica
1787 Puerto Rico
1 United States
81 Japan
8150 Japan
8170 Japan
8180 Japan
8190 Japan
82 South Korea
821 South Korea
84 Vietnam
84120 Vietnam
84121 Vietnam
84122 Vietnam
84123 Vietnam
84124 Vietnam
84125 Vietnam
85248 Hong Kong
85249 Hong Kong
85251 Hong Kong
我可以使用哪个sql查询来做到这一点?
复杂度不是可以通过联接进行的直接匹配。 需要使用最长的匹配项。
答案 0 :(得分:0)
您必须检查prefix
中的routes
及其所有子字符串,并使用COALESCE()
,直到从country_codes
中获得行
SELECT
r.prefix,
COALESCE(
(SELECT country FROM country_codes c WHERE c.code = r.prefix),
(SELECT country FROM country_codes c WHERE c.code = SUBSTR(r.prefix, 1, 4)),
(SELECT country FROM country_codes c WHERE c.code = SUBSTR(r.prefix, 1, 3)),
(SELECT country FROM country_codes c WHERE c.code = SUBSTR(r.prefix, 1, 2)),
(SELECT country FROM country_codes c WHERE c.code = SUBSTR(r.prefix, 1, 1))
) AS country
FROM routes AS r;