【问题标题】:Using column data as pattern for regexp match使用列数据作为正则表达式匹配的模式
【发布时间】:2012-11-13 21:38:10
【问题描述】:

最近,我们已从 MySQL 更改为 PostgreSQL。除了带有 Mysql 'REGEXP' 关键字的查询之外,大部分查询都已被翻译:

MySQL (prepared statement):
SELECT * FROM table WHERE ? REGEXP identifier;

我们有一个“表”,其中一列称为“标识符”。此“标识符”列包含实际的正则表达式模式。

因此,它不是在查询中对正则表达式模式进行“硬编码”,而是查找该模式的标识符列。

在 Postgresql 中,我们需要使用“~”关键字而不是“REGEXP”关键字(仅限 MySQL),但使用 Postgresql,我似乎无法从列中提取模式。

我尝试了以下查询但没有成功:

SELECT * FROM table WHERE 'test' ~ "identifier";
ERROR:  invalid regular expression: parentheses () not balanced


SELECT * FROM table WHERE "identifier" ~ 'test';
-> no results

出于测试目的,我创建了许多记录,其中“标识符”列包含 '.*' 作为值(匹配所有内容的正则表达式),但我仍然没有得到适当的结果。

非常欢迎帮助,谢谢!

【问题讨论】:

  • 为什么在引号中使用列名?尝试不使用它们。
  • @sufleR 这不是问题。 postgresql中使用双引号来指定列/表/模式/函数的确切名称...
  • 我们需要查看您的实际正则表达式模式。请在问题中或作为 sqlfiddle 提供对您失败的示例行。

标签: regex postgresql


【解决方案1】:

也许问题出在其中一个正则表达式字符串中? (正如错误字符串所说)

我已经测试过了

SELECT *
FROM table1 t
WHERE 'cat' ~ t.reg;

它对我有用。这是我的 SQL 小提琴。 http://sqlfiddle.com/#!12/f245c/3

问题可能在于不同的正则表达式解释。关于 postgresql 正则表达式的详细信息在这里http://www.postgresql.org/docs/current/static/functions-matching.html

UPD 另请阅读http://www.postgresql.org/docs/current/interactive/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS 了解有关 postgresql 字符串的详细信息。你需要这个来正确编写正则表达式。

【讨论】:

  • 感谢 Igor,我已经阅读了 postgresql 正则表达式页面。实际的正则表达式模式应该是正确的(我使用 .* 进行测试)。请问您使用的是哪个版本的postgresql?因为我测试了您的示例,但它对我不起作用: SELECT * FROM "Table1" t WHERE 'cat' ~ t.reg;错误:无效的正则表达式:括号()不平衡
  • @Freqo 我测试了 8.3 8.4 9.1 9.2 。查看SQL Fiddle链接sqlfiddle.com/#!1/f245c/1(页面顶部可以选择postgresql版本)
  • @Freqo:您能否在 sqlfiddle.com 上重现您的问题,以便我们准确了解发生了什么?
  • 不,我无法使用 sqlfiddle.com 进行复制,它在那里工作 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多