2012-11-24 80 views
0

假設我的表列包含以下2個行:Mysql的選擇所有匹配的字符串一個數字,

 1, 5, 2, 31, 12, 1212, 111 
     21, 25, 32, 43, 112, 212, 311 

我需要一個查詢來選擇包含數1,包含數2

行我的查詢是:

 SELECT * 
     FROM MyTable 
     WHERE My_String LIKE '%1%' AND My_String LIKE '%2%' 

現在,這將返回兩個行時,我希望它只返回第一行。

它選擇第二行,因爲數字21, 25, 32, 112, 212, 311也包含數字12

我的問題是我如何選擇所有這些行中的數字12包含在一個字符串中,但不是2-3位數字。我希望它能嚴格匹配那些12

+0

似乎沒有任何可以實現的方法。您可能需要更改在該列中存儲數據的方式(數據結構)。 – Chibuzo

回答

2

http://www.sqlfiddle.com/#!2/b082d/5

select * from testtable 
where instr(concat(', ', longstring, ', '), ', 2,') >0; 

select * from testtable 
where instr(concat(', ', longstring, ', '), ', 1,') >0 
and instr(concat(', ', longstring, ', '), ', 2,') >0; 
+0

+1我喜歡這個主意。與我在答案中寫的相比,它節省了許多比較。我只是想指出,因爲要求是同時出現數字1和2,您可能會添加一個條件與類似的行爲,爲數字1 :) –

+0

似乎工作,這項工作,如果我必須搜索2數字?例如,我想查找所有匹配數字1和15的記錄。你能解釋一下它是如何檢索數據的嗎?使用concat和instr不知道什麼instr – Giorgi

+0

當然它會工作。你可以嘗試我爲其他例子提供的sqlfiddle鏈接。 –

1

您可以使用正則表達式。 [[:<:]]是開始字邊界,[[:::]]是結束字邊界。

SELECT * FROM MyTable 
WHERE My_String RLIKE '[[:<:]]1[[:>:]]' 
AND My_String RLIKE '[[:<:]]2[[:>:]]' 
+0

所以這將嚴格匹配數字1和2?所以我會:WHERE My_String RLIKE'[[:<:]] [1],'AND My_String RLIKE'[[:<:]] [2],'[[:<:]] [1]從1開始,然後有逗號? – Giorgi

+0

在我看來,這可能是做一個或而不是和和? –

+0

這不夠好。它會失敗,如果「1」或「2」是最後一個號碼,因此在它之後沒有昏迷。如果列表只包含1個或僅包含2個,則相同。您的解決方案必須覆蓋所有可能的外觀:1-開始,2-中間,3-末端4-是唯一的元素。 –

0

您有幾種選擇:

1作爲主信息的評論中提到的,改變結構,不存儲連接的字符串

2-編寫一個函數來分割字符串,並檢查分號後數字1和2是否出現在令牌中。

3編寫「where」子句,用於捕獲字符串出現的每種可能性: 字符串可以出現在列表的開始,中間,結尾或是列表中的唯一元素。最後一個並不重要,因爲你需要1和2出現在一行中,因此應該消除包含單個元素的列表String。所以:

select * 
from MyTable 
where (My_String like '1,%' or My_String like '%, 1,%' or My_String like '%, 1') 
and (My_String like '2,%' or My_String like '%, 2,%' or My_String like '%, 2') 
相關問題