Как я могу проверить конкретные значения VARCHAR в SQLite - PullRequest
0 голосов
/ 10 мая 2018

Я создаю базу данных в sqlite для проекта, и я борюсь с той частью, в которой мне нужно создать таблицу с атрибутом, назовем ее ex1.Значения для ex1 должны быть строкой с t или T в конце, а другие символы строят число в интервале от 1 до 30. Поэтому я знаю, как проверить, является ли последний символ t или T, но я не знаюкак я могу проверить первые символы, если они строят числа от 1 до 30.

Это должно быть что-то вроде этого для последнего символа:

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

1 Ответ

0 голосов
/ 10 мая 2018

Моей первой мыслью было объединить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...