[英]MySQL 5.7 Compare only numbers from a mixed VARCHAR column
注:請注意,這是不一樣的類似名稱的問題(請參閱“我試過”,下同)
我需要在數據庫字符串列中搜索與給定搜索條件匹配的電話號碼。
數據庫列是一個varchar,其中包含各種用戶提供的附加(即非數字)字符。
我最初的想法是使用一個系統將列字符串轉換為僅數字格式(在PHP中這將通過PCRE函數),然后進行直接的縮進比較
id telephone: ---------------------- 1 '01576 456 567' 2 '07768345998' 3 '+447588 43 34 56' 4 '01524-901-335'
存在各種人類可讀格式,這些格式由最終用戶提交並且通常是歷史性的。
我找不到在此列中搜索數字的方法。 我已經將PHP中的搜索字段剝離為僅數字(0-9)。 我想嘗試類似的東西:
“搜索電話欄,找到數字ONLY值(來自混合字符串)與給定搜索字符串完全匹配的位置。
(偽代碼:)
SELECT telephone, id FROM phones WHERE REGEX_REPLACE(`telephone`, '[^0-9]') = :searchNumber
(:searchNumber是PDO占位符。)
“01576456567”
從輸入搜索詞到SQL查詢,我希望能夠檢索id號。 在上面的搜索示例中; $result['id'] = 1;
這僅適用於MySQL vesion 5.7。 我不能在這里使用MySQL 8.0。
這會導致很多次要工作將電話列轉換為數字列類型,我們現在沒有時間靈活地執行此操作。
MYSQL上的REGEXP類型函數返回true
/ false
(0/1)而不是REGEXP處理的輸出字符串。
CASE
到SIGNED
/ UNSIGNED
不起作用,因為它在字符串中的任何空格處斷開,也可以丟掉前導零。
我已經閱讀了各種 MySQL Stack Overflow答案
如果我的查詢混淆了這個PHP代碼可能更好地舉例說明我正在努力實現的目標。
如果所有其他方法都失敗了,我可以導出所有數字並通過PHP循環運行它們,這將做同樣的事情:
$searchNumber = preg_replace('/[^0-9]/','',$searchNumberSource); foreach ($numberFromDb as $row){ if(preg_replace('/[^0-9]/',''.$row) === $searchNumberSource){ // Matching number is found. break; } }
一個簡單的方法是嵌套使用replace
select replace(replace(replace(telephone,' ',''), '-',''), '+','')
您應該修復數據,使其符合您的使用方式。 這可能需要一些努力,但修復數據將簡化您的代碼 - 而不是艱苦的解決方案。
我的建議是在應用程序方面進行更改。 將數字更改為正則表達式:
SELECT telephone, id
FROM phones
WHERE telephone REGEXP :searchNumber_regex;
然后:searchNumber_regex
'"01576456567'
看起來像:
'^[^0-9]*0[^0-9]*1[^0-9]*5[^0-9]*7[^0-9]*6[^0-9]*4[^0-9]*5[^0-9]*6[^0-9]*5[^0-9]*6[^0-9]*7[^0-9]*$'
基本上,模式[^0-9]*
位於開頭和結尾,並且位於每個數字之間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.