【问题标题】:Oracle LIKE condition with year information带有年份信息的 Oracle LIKE 条件
【发布时间】:2014-12-14 11:49:15
【问题描述】:

我有一个表格,其中包含两个带有年份信息的属性(作为数字)

DateOfBirth   Number(4)   NULL,
DateDeceased  Number(4)   NULL,

我还做了一个检查约束,以确保日期正确,如下所示:

CONSTRAINT BirthValueCheck    CHECK (DateOfBirth < DateDeceased),
CONSTRAINT ValidBirthYear     CHECK (DateOfBirth LIKE '[1 - 2] [0 - 9] [0 - 9] [0 - 9]'),
CONSTRAINT ValidDeathYear     CHECK (DateDeceased LIKE '[1 - 2] [0 - 9] [0 - 9] [0 - 9]')

当我像这样在表中插入一个新值时:

INSERT INTO ARTIST(ArtistID, LastName, FirstName, Nationality, DateOfBirth, DateDeceased)
VALUES(SEQ_ARTISTID.NEXTVAL, 'Miro', 'Joan', 'Spanish', '1893', '1983');

我收到一条错误消息:

Error starting at line : 104 in command -
INSERT INTO ARTIST(ArtistID, LastName, FirstName, Nationality, DateOfBirth, DateDeceased)
VALUES(SEQ_ARTISTID.NEXTVAL, 'Miro', 'Joan', 'Spanish', '1893', '1983')
Error report -
SQL Error: ORA-02290: CHECK-beperking (DBI279057.VALIDDEATHYEAR) is geschonden.
02290. 00000 -  "check constraint (%s.%s) violated"
*Cause:    The values being inserted do not satisfy the named check

*Action:   do not insert values that violate the constraint.

我不明白为什么它会给我这个错误,因为 1983 在给定的约束下似乎是有效的。此外,它不会给我 DateOfBirth 检查约束的错误,它基本上是相同的约束,并且在 ValidDeathYear 约束之前声明。这是某种错误还是我错过了什么?

【问题讨论】:

    标签: sql oracle matching sql-like check-constraints


    【解决方案1】:

    LIKE 运算符不支持您正在使用的这种“正则表达式”语法。 LIKE 仅支持两种类型的通配符:单个字符_ 或多个字符%。它也不支持范围或“最小”长度值。

    另外:你不应该在数字上使用LIKE。 LIKE 用于字符串 (varchar, char)

    如果你想限制年份的范围,你需要使用这样的东西:

    CONSTRAINT ValidBirthYear     CHECK (DateOfBirth between 1900 and 2100)
    

    由于该列定义为number,因此无论如何您都不能在其中存储非数字值。

    【讨论】:

    • 的解决方案绝对有效,但是如果您想在问题中使用正则表达式语法,则可以使用 Oracle 的 REGEXP_LIKE() 函数,例如:CONSTRAINT ValidBirthYear CHECK ( REGEXP_LIKE( DateOfBirth, '^[12][0-9]{3}$' ) ) 接受的答案肯定比使用更好REGEXP_LIKE() 虽然它使用数字并避免任何奇怪的条目,如“2999”。
    猜你喜欢
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    相关资源
    最近更新 更多