【问题标题】:MySQL Select with regular expressionMySQL 选择正则表达式
【发布时间】:2016-01-11 07:35:10
【问题描述】:

我在 MySQL 中有一个表,TAB_FILE 有下面的列(file_pattern 包含与文件名对应的正则表达式)-

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

我想编写一个查询来查找 file_names.txt 中每个文件名的 client_id

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 查询不起作用。对此的任何帮助将不胜感激。

【问题讨论】:

  • 这有什么问题?

标签: mysql regex


【解决方案1】:

您需要将“$line”参数包含在引号中,例如:

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

然后就可以了。

【讨论】:

  • 我没有收到任何错误消息,只是它没有返回任何应该返回的结果。
【解决方案2】:

MySQL 支持 POSIX 样式的正则表达式,但不支持 Perl 兼容的正则表达式。 在您的示例中,您必须使用 [[:digit:]] 而不是 \d 才能使其工作。

【讨论】:

  • 那么有什么方法可以在选择查询本身中将此 RegEx 转换为 POSIX 样式的 RegEx 吗?
  • 我怀疑是否有适当的方法可以做到这一点,因为 PCRE 具有 POSIX 正则表达式中不可用的功能。手动转换这些功能的子集也容易出错(例如,用[[:digit:]] 替换\d 可能在您的示例中有效,但[\d\w] 不会)。或者lib_mysqludf_preg 似乎允许您在 MySQL 中使用 PCRE,但我从未测试过它,所以我不知道它的效果如何。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 2015-01-11
  • 2010-09-16
  • 1970-01-01
相关资源
最近更新 更多