2013-09-30 82 views
0

我具有包含deliveryPostcodes字段,它是逗號分隔的郵政編碼區的列表中的Store表:如何匹配逗號分隔列表中的前綴?

id deliveryPostcodes 
1  EC1,EC2,N1 
2  EC1,WC1,WC2 
3  N1,N2 

我想查詢此表用於匹配郵政編碼存儲,例如,如果用戶輸入EC2A 9XY,它應該返回第一行,因爲這個列表中有一個條目,它是完整郵政編碼的前綴。

有沒有解決方案做到這一點沒有自定義功能?

注:我知道我可以通過加入一個單獨的表,每行有一個郵政編碼區域,但我現在正在探索不同的選項。

+2

你的DB看起來很破舊。開始考慮儘快更改 –

+2

訣竅是永遠不要使用逗號分隔的列表。閱讀關於數據庫規範化的內容。 – fancyPants

+0

感謝評論傢伙,我期待他們,因爲你可以在我的頁腳註意到。仍然好奇探索不同的解決方案。 – Benjamin

回答

0

不是一個真正的答案,但是對於這個問題唯一正確的解決方案是:規範化數據並將其放在一個單獨的表中。由於您的解決方案是:

  1. 壞索引
  2. 壞的搜索
  3. 用正則表達式解決,這將有一個巨大的性能擊中
  4. 一旦你的數據庫開始增長這種結構會產生問題。

帶有郵編的查詢表也可能稍後派上用場。您可以在Google上輕鬆找到所需國家(或國家/地區)的郵政編碼列表,甚至可以以最少的工作將其導入到MySQL中。

+0

事實上,我認爲*這個*就是答案,儘管我起初不想考慮這個問題,因爲我想把注意力放在逗號分隔的解決方案上。但每個人的反應都讓我明白,沒有任何辯論! – Benjamin

+0

當你在一個沒有體面的規範化數據庫結構的大型項目上工作時,你會明白爲什麼它很重要:)雖然由於性能的原因,非規範化有時可能是人爲的!沒有什麼是黑白的...... – NDM

0

假設DeliveryPostcodes是數字值,您可以嘗試使用像這樣的正則表達式匹配。

SELECT * 
FROM Store 
WHERE deliveryPostcodes RLIKE '.*,?[0-9]+,?.*' 
+0

但是我會在'RLIKE'中放入什麼?我必須找出所有不同的前綴組合,並在'W','WC','WC2',...上執行它。另外,如果項目是列表中的第一個或最後一個,則不會有任何組合逗號一方,所以正則表達式將失敗! – Benjamin

+0

在正則表達式開頭的'。*,?'應該匹配零個或多個字符,後跟零個或一個逗號。類似地,在末尾匹配零或一個逗號,然後是零個或多個字符的',?。*'序列 – Litmus

+0

你說得對。但它也會匹配很多**任何**字符串:你可以很好地移除',?',結果將是相同的。 – Benjamin