Sql 如何在列上创建完全不区分大小写的检查约束

Sql 如何在列上创建完全不区分大小写的检查约束,sql,oracle,constraints,Sql,Oracle,Constraints,我正在尝试为一个表编写一个约束,该约束只允许名为“filename”的列接受包含“.docx”、““.doc”、“.pdf”和“.txt”的条目。我还希望文件扩展名不区分大小写,因此也可以接受“.pdf”和“.pdf”等。我尝试过以下代码: ALTER TABLE DOCS ADD CONSTRAINT DOCS_EXTENSION_CHK CHECK(FILENAME IN ('.docx', '.doc', '.pdf', '.txt')); 我曾尝试为具有不同扩展名的文件插入多个名称,如

我正在尝试为一个表编写一个约束,该约束只允许名为“filename”的列接受包含“.docx”、““.doc”、“.pdf”和“.txt”的条目。我还希望文件扩展名不区分大小写,因此也可以接受“.pdf”和“.pdf”等。我尝试过以下代码:

ALTER TABLE DOCS ADD CONSTRAINT DOCS_EXTENSION_CHK CHECK(FILENAME IN ('.docx', '.doc', '.pdf', '.txt'));
我曾尝试为具有不同扩展名的文件插入多个名称,如“RANDOMFILE.doc”和“FILENAME.PdF”,但我收到的所有文件都有错误

我需要这个约束来允许扩展名之前的文件名是任何名称,比如“xxxx.docx”

如果有人能帮我,我将非常感激。

使用
regexp\u like()

或者更简单地说:

ALTER TABLE DOCS ADD CONSTRAINT DOCS_EXTENSION_CHK 
    CHECK (REGEXP_LIKE(LOWER(FILENAME), '[.](docx|doc|pdf|txt)$'));

正则表达式很好。但是您可以简单地使用
lower()
like()
如下所示

ALTER TABLE DOCS ADD CONSTRAINT DOCS_EXTENSION_CHK
CHECK (
    lower(FILENAME ) LIKE ('%.docx') 
    or lower(FILENAME ) LIKE ('%.doc') 
    or lower(FILENAME ) LIKE ('%.pdf')
    or lower(FILENAME ) LIKE ('%.txt')
);

谢谢你迅雷不及掩耳的回复!这很好。@Gordon:使用字符类
[.]
而不是转义字符文本
\.
?@BobJarvis。我发现在不同的应用程序之间传递字符串时反斜杠很棘手(有时需要加倍),所以我只是想找到避免反斜杠的方法。
ALTER TABLE DOCS ADD CONSTRAINT DOCS_EXTENSION_CHK
CHECK (
    lower(FILENAME ) LIKE ('%.docx') 
    or lower(FILENAME ) LIKE ('%.doc') 
    or lower(FILENAME ) LIKE ('%.pdf')
    or lower(FILENAME ) LIKE ('%.txt')
);