所以我遇到这个问题,其中PostgreSQL正则表达式在两个不同的上下文中的行为方式不同 - 作为CONSTRAINT和regex_matches()函数。
我希望正则表达式能够像下面的SELECT语句一样工作,但是作为表CONSTRAINT,由于某些原因它不会。
有没有其他人遇到过这种行为,或者有没有人对此有任何见解?
谢谢!
CREATE TABLE ExampleTable (
ID serial,
Length char(5) NOT NULL,
CONSTRAINT proper_formatting CHECK (Length ~* '\A[0-5]{0,1}\d{1}:[0-5]{1}\d{1}\Z')
);
INSERT INTO ExampleTable (Length) VALUES ('03:33'); -- Passes.
INSERT INTO ExampleTable (Length) VALUES ('3:33'); -- Fails.
DROP TABLE ExampleTable;
-- In this context, it works just fine:
SELECT regexp_matches('03:33', '\A[0-5]{0,1}\d{1}:[0-5]{1}\d{1}\Z'); -- Passes.
SELECT regexp_matches('3:33', '\A[0-5]{0,1}\d{1}:[0-5]{1}\d{1}\Z'); -- Passes.
SELECT regexp_matches('93:33', '\A[0-5]{0,1}\d{1}:[0-5]{1}\d{1}\Z'); -- Fails.
SELECT regexp_matches('531:33', '\A[0-5]{0,1}\d{1}:[0-5]{1}\d{1}\Z'); -- Fails.
SELECT regexp_matches('3:83', '\A[0-5]{0,1}\d{1}:[0-5]{1}\d{1}\Z'); -- Fails.
答案 0 :(得分:1)
请勿使用char(n)
类型:
with data(val) as (
values
('03:33'::char(5)),
('3:33'::char(5)),
('3:33')
)
select format('==%s==', val), val ~* '\A[0-5]{0,1}\d{1}:[0-5]{1}\d{1}\Z' matches
from data
format | matches
-----------+---------
==03:33== | t
==3:33 == | f
==3:33== | t
(3 rows)
另请参阅:PostgreSQL: Difference between text and varchar (character varying)