Mysql

返回包含或不包含標點符號的結果

  • December 14, 2018

LIKEMySQL 中有沒有辦法使用包含或不包含標點符號(如撇號和連字元)的語句返回結果?

例如,如果我有以下查詢之一:

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) 列並在其上進行搜尋!在INSERTor上UPDATE,我們使用 . 消除了撇號、重音符號、連字元和空格(在名稱中)TRIGGER。顯然,你的片語需要空格,但你可以person's thing變成PERSONS THINGthing-thinginto THINGTHING

然後您使用原始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!)。如果你需要做任何復雜的事情,總是有TRIGGERs,但上面的解決方案現在相當標準!

引用自:https://dba.stackexchange.com/questions/190902