Oracle 中 UPPER() 函数的约束,缺少表达式

Posted

技术标签:

【中文标题】Oracle 中 UPPER() 函数的约束,缺少表达式【英文标题】:Constraints with UPPER() function in Oracle, missing expression 【发布时间】:2015-11-12 02:11:21 【问题描述】:
CREATE TABLE EMPLOYEE (
DISTRICT_ID                CHAR(5 BYTE)               NOT NULL,
EMP_ID                     CHAR(5 BYTE)               NOT NULL,
EMP_FNAME                  CHAR(50 BYTE)              NULL,
EMP_LNAME                  CHAR(50 BYTE)              NOT NULL,
ZIPCODE                    CHAR(5 BYTE)               NULL,
HIREDATE                   DATE               DEFAULT SYSDATE       NULL,
PREVIOUS_EXPERIENCE_YEARS  NUMBER(3,1)        DEFAULT 0             NULL,
HIGHEST_EARNED_DEGREE      CHAR(11 BYTE)      DEFAULT 'Bachelors'   NULL,
DIRECT_ADMIN_ID            CHAR(5 BYTE)       DEFAULT (null)        NULL,
IS_ADMIN                   CHAR(1 BYTE)       DEFAULT 'N'           NOT   NULL,
IS_TEACHER                 CHAR(1 BYTE)       DEFAULT 'Y'           NOT NULL,
EDU_EMAIL                  VARCHAR2(20 BYTE)          NOT NULL,
CONSTRAINT                   EMPLOYEE_PK        PRIMARY KEY(EMP_ID),
CONSTRAINT                   EMPLOYEE_FK      
FOREIGN KEY(DISTRICT_ID)
REFERENCES DISTRICT(DISTRICT_ID),
CONSTRAINT                   EMPLOYEE_FK1  
FOREIGN KEY(DIRECT_ADMIN_ID)
REFERENCES ADMIN(A_EMP_ID),
CONSTRAINT                   EMPLOYEE_UK1       UNIQUE(EDU_EMAIL),
CONSTRAINT                 HIGHEST_EARNED_DEGREEVALUES CHECK
                          (HIGHEST_EARNED_DEGREE IN ('GRE','High School',
                          'Associate','Bachelor','Master','Doctorate')),
CONSTRAINT                 HIREDATE CHECK ('HIREDATE'>='01-Jan-1950'),
CONSTRAINT                 EDU_EMAIL CHECK ('Anytext'>='2'),
CONSTRAINT                 EDU_EMAIL CHECK (SELECT = UPPER(EDU)) "Uppercase"
                                    FROM EDU_EMAIL
);

我要做的是添加一个约束来检查有效电子邮件地址的外观,电子邮件只需要正确格式化。此约束需要检查以确保输入到 EMPLOYEE.EDU_EMAIL 中的所有电子邮件地址都采用 [Anytext@[ANytext].edu 格式。无论我们在哪里看到 [Anytext],都必须至少有 2 个字符。 edu 部分必须是 edu,但可以是任何大写模式,例如 EDU 或 eDu 等。如果电子邮件包含两个字符和任何类型的 .edu 大写字母,则应接受该电子邮件。尝试以某种方式使用 UPPER() 函数来进行此约束。还将 EMPLOYEE.HIGHEST_EARNED_DEGREE 限制为我输入的值,我相信这应该是正确的。并将 EMPLOYEE.HIREDATE 限制为 1950 年 1 月 1 日或之后,拒绝不可能的条目。任何帮助表示赞赏。当我尝试在 Oracle 中运行它时,我得到了缺少的表达式。

【问题讨论】:

HIREDATE CHECK ('HIREDATE'>='01-Jan-1950'), - 我已经在你之前的问题中告诉过这有什么问题:***.com/a/33636737/330315 你真的阅读你得到的答案吗?你一遍又一遍地问同样的问题。 【参考方案1】:

这个check 约束没有意义:

CONSTRAINT EDU_EMAIL CHECK (SELECT = UPPER(EDU)) "Uppercase" FROM EDU_EMAIL

您不能在检查约束中使用子查询。您可以使用正则表达式。像这样的:

CONSTRAINT EDU_MAIL CHECK (REGEXP_LIKE(LOWER(EDU_MAIL), '^[a-z0-9._%+-]+@[A-Za-z0-9.-]+\.edu$')

至少有两个其他约束不正确,因为您在不合适的地方使用了单引号。 仅对字符串和日期常量使用单引号。

CONSTRAINT HIREDATE CHECK ('HIREDATE'>='01-Jan-1950'),
CONSTRAINT EDU_EMAIL CHECK ('Anytext'>='2'),

我不知道第二个应该是什么。第一个应该是:

CONSTRAINT HIREDATE CHECK (HIREDATE >= DATE '1950-01-01')

【讨论】:

这一切意味着什么—— '^[a-z0-9._%+-]+@[A-Za-z0-9.-]+\.edu$' 您写了“您不能在电子邮件中使用子查询”。我想你的意思可能是“你不能在检查约束中使用子查询”。 @BobJarvis 。 . .谢谢(我觉得这个错误很有趣)。 @barryrobinholt - 那是Regular Expression。正则表达式是一种用于匹配文本字符串中的模式的方法。 Regular Expression tutorial here。祝你好运。

以上是关于Oracle 中 UPPER() 函数的约束,缺少表达式的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库操作时如何使用LOWER()UPPER()函数

Oracle数据库操作时如何使用LOWER()、UPPER()函数

Oracle数据库操作时如何使用LOWER()、UPPER()函数

忽略空间的Oracle唯一约束和唯一索引

使用SQL Server中的UPPER函数进行索引

Oracle 设置大小写