2015-05-17 69 views
0

該查詢將從CompanyListings中選擇所有記錄,其中CompanyZip列中的至少一個郵政編碼在CityToZipCodes表的ZipCodes列中出現一次。 ZipCodes和CompanyZip列都是TEXT數據類型,所有值將始終是用逗號分隔的數字列表。SQL列表中的一個值至少在列表中出現一次

CityToZipCodes 
+----+---------+-----------------------------------+ 
| ID | City | ZipCodes       - 
+----+---------+-----------------------------------+ 
| 1 | Atlanta | 30028, 30040, 30041, 30107, 30151 - 
+----+---------+-----------------------------------+ 

CompanyListings 
+-----+-------------------+----------------------+ 
| ID | CompanyName  | CompanyZip   - 
+-----+-------------------+----------------------+ 
| 11 | BBB HVAC Company | 30028, 30188, 30107 - 
| 12 | Americool   | 30520, 30151, 30041 - 
+-----+-------------------+----------------------+ 

我曾嘗試使用LIKE和基於其他SO問題的幾個疑問,但是當這兩個表中的列值逗號分隔的名單,他們不工作。

SELECT * 
FROM CompanyListings 
WHERE CompanyZip IN (SELECT ZipCodes 
FROM CityToZipCodes 
WHERE City = "Atlanta"); 
+4

ouch,而不是編寫複雜的查詢,你最好規範你的數據模型。 – dnoeth

+0

數據庫不應該存儲CSV。而是創建諸如「CompanyID |」之類的查找表ZipCode',在那裏你將有一個每個公司每個zip的入口。 – JRLambert

+0

可能是一個有趣的閱讀:http://stackoverflow.com/questions/3653462/is-storing-a-delimited-list-in-a-database-column-really-that-bad – Timo

回答

0

您最好創建新表來存儲公司ID和每個相關的郵政編碼。對城市也一樣。在此之後,您可以有效地使用IN和適當的索引。

如果您必須對現有數據執行此操作,則需要創建一個接受兩個郵政編碼的小函數,當郵政編碼中有任何匹配的郵政編碼時返回true。然後你可以使用這樣的功能加入這兩個表格:

Select * from companylist c left join citylist t on match_zips(c.zips,t.zips)>0 

它會很慢。

相關問題