簡體   English   中英

MySQL 5.7僅比較混合VARCHAR列中的數字

[英]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處理的輸出字符串。

  • CASESIGNED / 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM