2010-03-18 35 views
1

我在比較VARCHAR字段中的值時遇到了一些問題。比較MySQL查詢中字符串的值

我有一個產品表,每個產品都有數量。我將卷存儲在VARCHAR字段中,通常是一個數字(30,40,200),但是有多個卷的產品,其數據以分號分隔存儲,如30; 60; 80。

我知道存儲多個像這樣的卷是不推薦的,但我必須像它一樣使用它。

我試圖通過音量函數來搜索產品。我還想顯示與搜索到的音量相同或更大的音量的產品。 這對於具有單個卷的產品而言並不是問題,但這是多卷產品的問題。

也許一個例子會讓事情變得更加清晰:比方說,我在這個卷的字段中有一個產品:30; 40; 70; 80。 如果有人搜索了一個音量,讓我們說50,我希望顯示該產品。

要做到這一點,我想寫我自己的自定義MySQL函數(我從來沒有這樣做過),但也許有人可以提供一個不同的解決方案。

我爲我可憐的英語表示歉意,但我希望我明確提出了我的問題。

謝謝。

+0

如果表格非常大,性能將會很糟糕,因爲您無法利用該字段上的任何索引。 – JohnFx 2010-03-18 19:04:27

+0

卷是否總是按從左到右的順序存儲? – 2010-03-18 19:54:17

+0

JohnFx,我們打算使用緩存,希望能夠提高性能。馬克·拜爾斯,我不太確定,明天我得去檢查一下。 – b2238488 2010-03-18 20:02:15

回答

1

您只需要與最大值進行比較。卷是否總是按照從左到右的順序存儲?如果是這樣,然後比較最後一個分號後的值(如果存在的話)。您可以使用SUBSTRING_INDEX選擇最後一個值。

SELECT * 
FROM products 
WHERE CAST(SUBSTRING_INDEX(volume, ';', -1) AS UNSIGNED) >= 50 
+0

你的答案看起來可行,非常感謝。 關於卷的排序,我現在不確定,但我懷疑他們尊重遞增的順序。 – b2238488 2010-03-18 20:05:11

+0

>卷是否始終按照從左到右遞增的順序進行存儲? 是的,他們是。 – b2238488 2010-03-19 18:44:54