gpt4 book ai didi

regex - PostgreSQL 数字匹配正则表达式的奇怪行为

转载 作者:行者123 更新时间:2023-11-29 12:18:30 25 4
gpt4 key购买 nike

所以我遇到了这个问题,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.

最佳答案

不要使用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)

关于regex - PostgreSQL 数字匹配正则表达式的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39921783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com