7

我只想获取在一列中有一些单词的记录,我尝试过使用WHERE ... IN (...),但 Postgres 在这个 where 子句中区分大小写。这就是我尝试正则表达式和~*运算符的原因。

以下是从数据库返回所有列和表的 SQL 片段,我想限制行以仅带正则表达式中的表。

SELECT ordinal_position as COLUMN_ID, TABLE_NAME, COLUMN_NAME
                        FROM information_schema.columns
                        WHERE table_schema = 'public' and  table_name ~* 'PRODUCTS|BALANCES|BALANCESBARCODEFORMATS|BALANCESEXPORTCATEGORIES|BALANCESEXPORTCATEGORIESSUB'
                        order by TABLE_NAME, COLUMN_ID

此正则表达式将带入 BALANCES 的所有列以及包含“BALANCES”关键字的表的列。

我想将结果限制为仅完整的名称。

4

2 回答 2

8

使用正则表达式,常见的解决方案是在当前表达式之前和之后使用单词边界。

不看效果:http ://regexr.com?35ecl

查看单词边界的效果:http ://regexr.com?35eci

在 PostgreSQL 中,单词边界由\y (其他流行的正则表达式引擎,如 PCRE、C# 和 Java,使用\b代替 - 因此在上面的正则表达式演示中使用 - 感谢@IgorRomanchenko

因此,对于您的情况,可以使用以下表达式(匹配项与上面链接中的示例正则表达式相同)

'\y(PRODUCTS|BALANCES|BALANCESBARCODEFORMATS|BALANCESEXPORTCATEGORIES|BALANCESEXPORTCATEGORIESSUB)\y'

在此处查看此表达式的演示: http ://sqlfiddle.com/#!12/9f597/1

于 2013-07-02T15:02:52.557 回答
3

如果您只想匹配整体,请table_name使用类似

'^(PRODUCTS|BALANCES|BALANCESBARCODEFORMATS|BALANCESEXPORTCATEGORIES|BALANCESEXPORTCATEGORIESSUB)$'

^匹配字符串的开头。

$匹配字符串的末尾。

详情here

或者,您可以使用类似的东西:

 upper(table_name) IN ('PRODUCTS','BALANCES','BALANCESBARCODEFORMATS','BALANCESEXPORTCATEGORIES', ...)

使IN大小写不敏感。

于 2013-07-02T15:13:58.110 回答