Моей первой мыслью было объединить 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 )
);
К сожалению, из-за очень разрешающего способа, которым CAST преобразует строки в целые числа (просто игнорируя что-либо после первого нецифрового числа), это также будет соответствовать множеству нежелательных значений, таких как '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)
)
)
);
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