2015-10-13 99 views
1

我有一個表在MySQL,TAB_FILE下面列(FILE_PATTERN包含正則表達式correspoding爲文件名) -用正則表達式的MySQL選擇

client_id | file_pattern 
------------------------ 
91 | ^s101-XXX-typeA_\d{4}-\d{2}-\d{2}.csv.gz$ 
92 | ^s102-YYY-typeA_\d{4}-\d{2}-\d{2}.csv.gz$ 

而且我有一個包含文件名的文件的列表,用於如,

file_names.txt - 
s101-XXX-typeA_2015-10-12.csv.gz 
s102-YYY-typeA_2015-10-10.csv.gz 

我想編寫一個查詢查找每個文件名CLIENT_ID在file_names.txt

cat file_names.txt | while read line 
do 
    mysql -u*** -p*** DB1 -e "select client_id from TAB_FILE where $line rlike file_pattern" 
done 

此SQL查詢不起作用。任何幫助,將不勝感激。

+0

有什麼不合適呢? –

回答

1

MySQL支持POSIX風格的正則表達式,但不支持Perl兼容的正則表達式。 在你的例子中,你必須使用[[:digit:]]而不是\d來使它工作。

+0

那麼有沒有什麼辦法可以將這個RegEx轉換爲select查詢本身的POSIX風格的RegEx? –

+0

我懷疑有這樣做的正確方法,因爲PCRE具有POSIX正則表達式中沒有的功能。手動轉換這些功能的一個子集也很容易出錯(例如用'[[:digit:]]替換'\ d''可能適用於您的示例,但'[\ d \ w]'不會)。或者[lib_mysqludf_preg](https://github.com/mysqludf/lib_mysqludf_preg#readme)似乎允許您在MySQL中使用PCRE,但我從未測試過它,所以我不知道它的工作效果如何。 – Goujon

0

你需要用你的「$行」參數爲引號,是這樣的:

"select client_id from TAB_FILE where '$line' rlike file_pattern" 

然後它會奏效。

+0

我試過使用引號,但它不工作。 –

+0

你收到什麼樣的錯誤信息? –

+0

我沒有收到任何錯誤消息,只是它不應該返回任何結果。 –