2015-10-13 56 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

我没有收到任何错误消息,只是它不应该返回任何结果。 –