返回包含或不包含標點符號的結果
LIKE
MySQL 中有沒有辦法使用包含或不包含標點符號(如撇號和連字元)的語句返回結果?例如,如果我有以下查詢之一:
SELECT * FROM some_table WHERE some_value LIKE "%this-thing%";
或者
SELECT * FROM some_table WHERE some_value LIKE "%person's thing%"
有沒有一種方法可以讓我獲得與下面的查詢相同的結果,但只有一個 LIKE 子句?
SELECT * FROM some_table WHERE (some_value LIKE "%this-thing%") OR (some_value LIKE "%this thing%");
或者
SELECT * FROM some_table WHERE (some_value LIKE "%person's thing%") OR (some_value LIKE "%persons thing%");
基本上是一個函式,如果存在任一版本的文本(“person’s thing”或“persons thing”),搜尋時將返回結果,例如:
編輯
mysql中有一個函式會在列中只返回字母數字字元嗎?例如,如果列值是“something’s & other-stuff”,那麼它將作為“somethingsotherstuff”返回?所以查詢看起來像:
SELECT * FROM table WHERE magic_function(column_name) LIKE '%words%'
編輯 x2
目前我已經通過將 REPLACE() 連結在一起並在進行比較之前用“”替換列值中的所有特殊字元來解決這個問題。被比較的值也被去除了所有特殊字元。
前段時間我也遇到過類似的情況。這是愛爾蘭的一個文化組織會員系統項目,其中一個要求是該系統處理愛爾蘭名字。
愛爾蘭名字可能非常複雜,帶有
O
,O'
,Ó
,Ó'
,Mac
,Mc'
,Mc
(後面都有空格或不帶空格),在某些情況下,名字如Ua hÚigínn
(不是錯字——小寫h
字母后跟大寫字母Ú
在愛爾蘭語中是正確的)。如您所見,還有重音字元(a、e、i、o 和 u 可以帶重音)。問題是許多人使用這些名稱的許多不同變體,帶有/不帶有撇號、重音和替代拼寫。您可以將這些視為您所在
some_value
領域的不同拼寫!我們所做的是創建一個“陰影”(
some_value_search
) 列並在其上進行搜尋!在INSERT
or上UPDATE
,我們使用 . 消除了撇號、重音符號、連字元和空格(在名稱中)TRIGGER
。顯然,你的片語需要空格,但你可以person's thing
變成PERSONS THING
和thing-thing
intoTHINGTHING
。然後您使用原始
some_value
欄位顯示您的數據,但始終在some_value_search
.這是在計算/計算/生成欄位之前的幾天。但是 MySQL(截至5.7.6)擁有它們,您應該能夠消除使用它們的很多/大部分/所有任何觸發程式碼。
col_name data_type [GENERATED ALWAYS] AS (expression) [VIRTUAL | STORED] [NOT NULL | NULL] [UNIQUE [KEY]] [[PRIMARY] KEY] [COMMENT 'string']
您上面的(表達式)可以是(REPLACE (REPLACE(field, ‘-’, ‘’), ‘’’, ‘’) 來消除空格和連字元。但是,由於 MySQL 缺少
[TRANSLATE()][3]
函式,用於製作的程式碼字元串全大寫是可怕的(26 個嵌套REPLACE
的 s!)。如果你需要做任何復雜的事情,總是有TRIGGER
s,但上面的解決方案現在相當標準!