2009-11-06 48 views

回答

2

通常,這不是你應該如何將數據存儲在關係數據庫中。

也許你應該有一個MinBedroomMaxBedroom列。例如:

SELECT * FROM properties WHERE MinBedroom > 1 AND MaxBedroom < 3; 
+1

對於您對MinBedroom和MaxBedroom列的評論中的建議+1。請將其複製到此答案中! :) – 2009-11-06 19:44:07

+0

謝謝比爾:)編輯包含這個答案。 – 2009-11-06 19:59:23

4

在SQL中處理此問題的正確方法是爲多值屬性添加另一個表。在一個列中存儲多個離散值是違背關係模型的。由於它旨在成爲一個「否」,因此SQL語言對它的支持很少。

在逗號分隔列表中查找給定值的唯一方法是使用正則表達式,這些表達式通常很醜且很慢。你必須處理邊界情況,例如值可能會或可能不在字符串的開始或結尾,以及逗號旁。

SELECT * FROM properties WHERE bedrooms RLIKE '[[:<:]]2[[:>:]]'; 

還有其他類型的查詢很容易,當你有一個規範化的表,但很難用逗號分隔的列表。您提供的搜索等於或大於搜索條件的值的示例就是這種情況。另請考慮:

  • 如何從逗號分隔的列表中刪除一個元素?
  • 如何確保列表按排序順序?
  • 房間的平均數量是多少?
  • 如何確保列表中的值是有效的條目?例如。什麼是阻止我進入「1,2,香蕉」?

如果你不想創建第二個表,那麼就想出一個方法來用一個值表示你的數據。


更準確的說,我應該說我建議你用一個值代表數據柱,和Mike Atlas的解決方案完成該操作。

+0

感謝您的徹底迴應!有一件事我應該在問題中更加清楚的是,我真正需要搜索的是一個數字範圍,也就是說,我並不需要知道1到5之間的內容,因爲我知道它會是2 ,3和4. 所以真的問題是,是否存在針對存儲爲1-3的範圍構建某種低/高查詢? – 2009-11-06 19:38:48

+2

只有兩列。 MinBedroom和MaxBedroom。其中MinBedroom> 1 AND MaxBedroom <3。 – 2009-11-06 19:40:27

+0

是的,麥克阿特拉斯+1。這就像當你爲時間範圍設計一個表格時,你有一個「開始」列和一個「完成」列,然後你可以很容易地進行查詢。 – 2009-11-06 19:43:17