【问题标题】:Regular expression: Postgres SQL query is returning all records available in the table正则表达式:Postgres SQL 查询正在返回表中可用的所有记录
【发布时间】:2023-03-12 13:22:01
【问题描述】:

下面的 Postgres SQL 查询返回表中所有可用的记录。 有人可以对此做出解释吗? . 另外请让我知道 * 在 postgres 正则表达式的情况下代表什么。

Employee table contains :

name
Chennai
Delhi
Hydrabad
NewYark
ABC

select * from employee where name ~ 'Z*'

【问题讨论】:

  • Z 后面的星表示 0 或多个 Z(在字符串中的某处)。所以正则表达式引擎选择 0 Z 并匹配每个字符串。

标签: sql regex postgresql


【解决方案1】:

* 量词表示零个或多个。由于每个名称至少包含零个Z 字符,因此返回每一行。

你不需要使用正则表达式来查找以字符开头的字符串,你可以使用LIKE

SELECT record FROM myrecords WHERE name LIKE 'Z%';

如果您希望名称以 Z 开头使用正则表达式,请尝试以下操作:

SELECT record FROM myrecords WHERE name ~ '^Z';

如果您希望名称中至少包含一个 Z,请尝试以下方法之一:

SELECT record FROM myrecords WHERE name LIKE '%Z%';
SELECT record FROM myrecords WHERE name ~ 'Z';

【讨论】:

  • @araqnid:想象一下我拍了拍我的额头。想太多正则表达式是多么容易,这很有趣。感谢您的提醒:)
【解决方案2】:

这是查找以“Z”开头的名称的正确查询:

SELECT record FROM myrecords WHERE name ~ '^Z';

在您的查询中:

select * from employee where name ~ 'Z*'

含义是名称匹配零个或多个字符“Z”序列,因此返回所有记录。

  • 匹配条件中的* 表示出现零次或多次。

  • * 和 tilda 表示不区分大小写的匹配,即 ~* 'Z' 将同时匹配 "z" 和 "Z"

更多请看这里:

http://oreilly.com/pub/a/databases/2006/02/02/postgresq_regexes.html?page=1

【讨论】:

  • 只是为了使示例完整:要获取名称以 Z 开头的所有行,不需要正则表达式。 where name like 'Z%' 会做同样的事情
猜你喜欢
  • 2010-10-23
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多