2014-06-24 46 views
3

我可以使用類似case的東西在substring_index中給出多個匹配模式嗎?substring_index中的Mysql多機模式

更具體地說,在我的情況下,我可以根據它們的ASCII來匹配一組字符嗎?

添加一些例子:

中文Q100 
中文T800 
中文中文K999 

的字符串開始與一些中國字,然後通過一些數字或拉丁字母下面,我要的是字符串分爲兩個部分:一個包含中國漢字(從最左邊到第一個西方字母),另一個是從第一個西方字母到最右邊。

像這些:

中文, Q100 
中文, T800 
中文中文, K999 
+1

舉個例子會更好。但是'CASE'通常會使用第一個評估爲真的條件,所以它會變得複雜。 – VMai

+0

你想達到什麼目的?在源集合和期望的結果行集合中創建一些樣本。試着用至少「僞」-SQL解釋。目前還不清楚 –

+0

@VMai添加示例 –

回答

2

有解決問題的多種方式。我會給你3個,從最右邊開始。

架構解決方案

使用應用程序

你的問題是有關 - 更換正則表達式。而且這在MySQL中支持很弱(準確地說,不支持用正則表達式替換)。因此,您可以執行以下操作:選擇整個記錄,然後使用a-zA-Z0-9掩碼將其分成應用程序,例如。

或者可能會改變表格結構?

嗯,替代方法是:可能你應該將這些數據分隔成2列嗎?如果你的意圖是使用單獨的數據部分,那麼這可能是改變你的數據庫架構的一個標誌?


使用MySQL

第二種方法是使用MySQL。要做到這一點 - 是的,你會使用REPLACE()。例如,要擺脫所有的字母數字符號,你會做:

SELECT [...REPLACE(REPLACE(str, 'z', ''), 'y', '')...] 

這是一個僞SQL,因爲發佈整個26種+ 26種+ 10種的REPLACE情況下會被氣死(但是,使用這也瘋了)。但是這當然會解決你的問題。


使用外部REGEXP解決方案

這是第三條道路,它有兩個子情況。您可以使用UDF或存儲的例程。

使用UDF

存在提供的正則表達式替換功能的第三方庫。然後,你需要做的就是將這些庫包含到你的服務器版本中。示例:lib_mysqludf_preg但是,這需要執行其他操作才能使用這些庫。

使用存儲例程

好了,你可以使用保存的程序來創建自己的替換功能。實際上,我已經寫了這樣的庫,它叫做mysql-regexp,它提供REGEXP_REPLACE()函數,它允許你用正則表達式在字符串中進行替換。它沒有經過很好的測試,所以如果你決定使用它 - 那就自己承擔風險。示例應該是:

mysql> SELECT REGEXP_REPLACE('foo bar34 b103az 98feo', '[^a-z]', ''); 
+--------------------------------------------------------+ 
| REGEXP_REPLACE('foo bar34 b103az 98feo', '[^a-z]', '') | 
+--------------------------------------------------------+ 
| foobarbazfeo           | 
+--------------------------------------------------------+ 
1 row in set (0.00 sec) 

由於它完全用存儲的代碼編寫,所以不需要重新構建服務器或其他任何東西。

+0

感謝您提供這樣的詳細解決方案。 –

+0

其實,我的目標是試圖改變數據庫的架構,我需要將列分成兩部分,以實現數據庫的1NF。 根據你的文章,我認爲使用應用程序和正則表達式可能是最簡單的解決方案,我會嘗試這種方式。 非常感謝。 –