PostgreSQL:通过正则表达式过滤行

时间:2020-08-20 10:25:26

标签: sql regex postgresql

我想验证字符串是否以name开头(后跟3位数字)并以state结尾。

我的代码做到了

实际输出:不是,不是,是,是,是,是,不是。

预期输出:不,不,不,不,不,是,不

CREATE TABLE yourtable
("f1" varchar(19))
;

INSERT INTO yourtable
("f1")
VALUES
  ('name123/state/LA'),
  ('name123/state/LA/X1'),
  ('name1/state/'),
  ('nameabcccc/state/'),
  ('name3444/state/'),
  ('name444/state/'),
  ('name1/state/LA')
 ;

  SELECT f1,
  CASE when trim(f1) ~ '^name[^/]*/state\/$' then 'YES' ELSE 'NOT' END col2
  FROM yourtable

1 个答案:

答案 0 :(得分:3)

以名称开头(后跟3位数字),以状态结尾。

这不是您的正则表达式所做的。您缺少3位数字的模式,/字符不需要转义。

以下内容将发挥您的作用

trim(f1) ~ '^name[0-9]{3}[^0-9]*/state/$'

因此正则表达式可以确保

  • 字符串以^name
  • 开头
  • 后跟三位数字[0-9]{3}
  • 后跟除数字[^0-9]*之外的任何其他字符
  • 使用/state/$以“ / state /”结尾