如何在sqlite中检查varchar的特定值

如何在sqlite中检查varchar的特定值,sql,sqlite,Sql,Sqlite,我正在为一个项目在sqlite中创建一个数据库,在这个部分中,我必须创建一个属性为ex1的表。 ex1的值应该是一个末尾有t或t的字符串,其他字符以1到30的间隔生成一个数字。 所以我知道如何检查最后一个字符是t还是t,但我不知道如果第一个字符的数字是1到30,我如何检查它们 最后一个字符应该是这样的: CREATE TABLE tablename( ex1 VARCHAR NOT NULL CHECK ( ex1 LIKE '%t')); 我的第一个想法是结合CAST和SUBSTR来检查字符

我正在为一个项目在sqlite中创建一个数据库,在这个部分中,我必须创建一个属性为ex1的表。 ex1的值应该是一个末尾有t或t的字符串,其他字符以1到30的间隔生成一个数字。 所以我知道如何检查最后一个字符是t还是t,但我不知道如果第一个字符的数字是1到30,我如何检查它们

最后一个字符应该是这样的:

CREATE TABLE tablename( ex1 VARCHAR NOT NULL CHECK ( ex1 LIKE '%t'));

我的第一个想法是结合CAST和SUBSTR来检查字符串中除最后一个字符外的所有字符的值:

CREATE TABLE tablename( ex1 VARCHAR NOT NULL 
    CHECK ( ex1 LIKE '%t') 
    CHECK ( CAST(SUBSTR(ex1, 1, LENGTH(ex1)-1) AS INT) BETWEEN 1 AND 30 )
);
不幸的是,由于将字符串强制转换为整数的非常宽松的方式(只需忽略第一个非数字后面的任何内容),这也将匹配许多不受欢迎的内容,例如
'4.5t'
,甚至
'23qwerty45t'

一个更混乱但更准确的方法,因为我们只讨论一个或两个数字,将分别检查一个数字和两个数字的情况:

CREATE TABLE tablename( ex1 VARCHAR NOT NULL 
    CHECK ( ex1 LIKE '%t') 
    CHECK ( 
            (
              (LENGTH(ex1) = 2) 
                AND 
              (CAST(SUBSTR(ex1, 1, 1) AS INT) BETWEEN 1 AND 9)
            )
              OR
            (
              (LENGTH(ex1) = 3) 
                AND 
              (CAST(SUBSTR(ex1, 1, 2) AS INT) BETWEEN 10 AND 30)
            )
          )
);


@glibdud我不明白你想说什么。这是对之前删除的评论的回应。@glibdud你为什么删除你的答案?很好,但我还有一个问题。你能再加一次吗?我意识到它有一个大问题;我一直在寻找解决办法,但结果一无所获。如果我不能很快找到解决方案,我会带着免责声明回来。@glibdud你发现了什么问题?我用类似于“01T”的字符串对它进行了测试,它保存在表中,但我只希望是1到30之间的数字,前面没有0。
sqlite> INSERT INTO tablename VALUES('1t');
sqlite> INSERT INTO tablename VALUES('30t');
sqlite> INSERT INTO tablename VALUES('31t');
Error: CHECK constraint failed: tablename
sqlite> INSERT INTO tablename VALUES('0t');
Error: CHECK constraint failed: tablename
sqlite> INSERT INTO tablename VALUES('111t');
Error: CHECK constraint failed: tablename
sqlite> INSERT INTO tablename VALUES('tt');
Error: CHECK constraint failed: tablename
sqlite> INSERT INTO tablename VALUES('01t');
Error: CHECK constraint failed: tablename
sqlite> INSERT INTO tablename VALUES('12.5t');
Error: CHECK constraint failed: tablename
sqlite> INSERT INTO tablename VALUES('23qwerty45t');
Error: CHECK constraint failed: tablename