當我們需要對數據做篩選和查詢的時候,往往會涉及到篩選或者查詢包含某個字符串的情況,下面列出幾個實現方法。
like
like的用法肯定都很熟悉,它可以匹配字段以某字符串開始,以某字符串結尾,包含有某字符串,用法如下:like ‘string%’,like ‘%string’,like ‘%string%’
find_in_set
現在我們遇到這樣一個需求,字段裏面的值存儲形式是這樣的,‘12,15’,‘3,5,2,14’, ‘22,25,28,29’,然後需要判斷字段裏面是否有5這個值,如果我們使用like的話,肯定是得不到正確的結果
這裏我們來了解一下find_in_set,它是一個mysql字符串函數,用它就可以解決上面的問題,用法如下:find_in_set(5, 字段名稱) = 0表示該字段不含有5,find_in_set(5, 字段名稱) >= 1表示該字段含有5,舉個例子:
SELECT find_in_set('5', '3,5,2,14') as test;
-> 2
SELECT find_in_set('2', '22,25,28,29') as test;
-> 0
但是這裏面有個問題,如果你的字段存儲的值的形式是這樣的’[3,5,2,14]’,那麼使用find_in_set就會導致結果不正確
SELECT find_in_set('5', '[3,5,2,14]') as test;
-> 2
SELECT find_in_set('3', '[3,5,2,14]') as test;
-> 0
這是因爲在find_in_set中,它是以,爲分割的,所以單獨查3是查不到的,應該查’[3’;
locate
它也是一個mysql字符串函數,方法如下:locate(單個字符串, 字段名稱),和find_in_set用法相似,那它倆有沒有區別的呢,看如下例子:
執行sql語句:
SELECT find_in_set('5', '3,5,2,14') as test;
-> 2
SELECT locate('5', '3,5,2,15') as test;
-> 3
但是它也有他的問題,也會導致結果不準確,如下:
SELECT locate('5', '22,25,28,29') as test;
-> 5
這裏locate是按字符串來計算的,一個字符串就是1,所以它會把你本來是一個數字的會給你算成多個字符串;
POSITION
它也是一個mysql字符串函數,方法如下:POSITION(單個字符串 in 字段名稱),和locate用法一樣,如下例子:
SELECT POSITION('5' in '3,5,2,14') as test;
-> 3
SELECT locate('5', '3,5,2,15') as test;
-> 3
INSTR
它也是一個mysql字符串函數,方法如下:INSTR(字段名稱, 單個字符串),和locate用法一樣,如下例子:
SELECT INSTR('3,5,2,14','5') as test;
-> 3
SELECT locate('5', '3,5,2,15') as test;
-> 3