SQL检查约束VARCHAR

SQL检查约束VARCHAR,sql,oracle,constraints,Sql,Oracle,Constraints,如何检查数据,确保前4个字符是一组特定的字母,而后4个字符是数字?以及一系列的值 例如,数据可以是ABCD2121、ABCD1111 范围-ABCD0001至ABCD9999 因此,当数字发生变化时,“ABCD”是固定的 我已经在网上讨论过使用“[]”来定义数字,但我无法将其集成到我的约束中 谢谢您的检查条件如下: create table table1 ( column1 varchar2(8) check constraint column1_ch check ........ );

如何检查数据,确保前4个字符是一组特定的字母,而后4个字符是数字?以及一系列的值

例如,数据可以是ABCD2121、ABCD1111

范围-ABCD0001至ABCD9999

因此,当数字发生变化时,“ABCD”是固定的

我已经在网上讨论过使用“[]”来定义数字,但我无法将其集成到我的约束中


谢谢

您的检查条件如下:

create table table1
(
  column1 varchar2(8)
  check constraint column1_ch check ........
);
编辑:修改为使用设定前缀与字母字符的范围

下面是一个使用Microsoft SQL Server的解决方案,它不支持以下内容:

(column1 LIKE 'ABCD[0-9][0-9][0-9][1-9]')
DECLARE@MyTable表
(第1列varchar(8)检查(第1列类似“ABCD[0-9][0-9][0-9][1-9]”)
插入@MyTable(第1列)
选择“ABCD0000”
联合选择“ABCD2121”
工会选择“ABCD1111”;
挑选*
来自@MyTable;
插入@MyTable(第1列)

选择“ABCD000A”;--如果您有一组固定的前缀,请使用regexp_like并枚举前缀列表:

DECLARE @MyTable TABLE
(column1 varchar(8) check (column1 LIKE 'ABCD[0-9][0-9][0-9][1-9]'))

INSERT INTO @MyTable (column1)
       SELECT 'ABCD0000'
 UNION SELECT 'ABCD2121'
 UNION SELECT 'ABCD1111';

SELECT *
  FROM @MyTable;

INSERT INTO @MyTable (column1)
SELECT 'ABCD000A'; --<== Fails!

INSERT INTO @MyTable (column1)
SELECT 'ABCD221'; --<== Fails!

这将允许ABCD和EFGH作为前缀,后面紧跟4位数字。

最简单的方法是使用正则表达式:

alter table test_1 
add constraint chk_col1 check(regexp_like(column1, '(ABCD|EFGH)[0-9]{4}'));

如果您的SQL风格允许,请查看子字符串函数或使用正则表达式,并确保您不会对任何子字符串函数感到惊讶。但这将允许任何4个字母的前缀-这不是OP想要的。LIKE不支持正则表达式(至少在标准SQL中不支持,在Oracle中肯定不支持)@FrankSchmitt你说得对-我已经更新了示例,只允许使用'ABCD'前缀。但似乎确实比我的好。在设置此约束后,它是成功的。但是我无法将数据导入表中。它违反了我尝试的约束。但是我尝试了一种没有名称的方式,并且没有问题。我能够导入data。
alter table table1
  add constraint chck_code check (regexp_like(column1, '(ABCD)[0-9]{4}') );