Я не использовал одинарные кавычки в столбце VARCHAR, но запрос все еще выполняется? - PullRequest
0 голосов
/ 16 мая 2018

Приведенный ниже фильтр запросов по двум столбцам в предложении WHERE. Оба столбца имеют тип данных VARCHAR. Чисто по ошибке я запустил запрос, не заключая в одинарные кавычки значения column2, и он успешно прошел и вернул правильный набор результатов.

Запрос:

SELECT * 
FROM table
WHERE column1 = 'QTR12345678'
  AND column2 IN (120012, 220015)

Примечание: если я только ищу на column2, то получаю ожидаемую ошибку

Не удалось выполнить преобразование при преобразовании значения varchar ...

Похоже, что механизм SQL неявно преобразует значение из числового в varchar в этом случае. Почему?

(я использую SQL Server 2012 SP2)

Ответы [ 2 ]

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

Существует одна ситуация, когда может произойти нечто подобное: когда нет строк, соответствующих P_1 для WHERE P_1 AND P_2. P_2 даже не оценивается, так как false AND P равно false независимо от P.

Рассмотрим этот пример:

CREATE TABLE elbat
             (nmuloc_1 VARCHAR(8),
              nmuloc_2 VARCHAR(8));

INSERT INTO elbat
            (nmuloc_1,
             nmuloc_2)
            VALUES ('A',
                    'aaa'),
                   ('B',
                    'bbb'),
                   ('C',
                    'ccc');

SELECT *
       FROM elbat
       WHERE nmuloc_2 = 123;
-- Fails with "Conversion failed when converting the varchar value 'aaa' to data type int."

SELECT *
       FROM elbat
       WHERE nmuloc_1 = 'X'
             AND nmuloc_2 = 123;
-- Succeeds

дб <> скрипка

Во втором запросе SELECT нет строк для nmuloc_1 = 'X'. Так что nmuloc_2 = 123 не оценивается и запрос выполняется успешно. (С пустым набором результатов.)

В первом nmuloc_2 = 123 - единственный предикат. Он должен быть оценен, и запрос завершается с ошибкой преобразования.

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

Этот ответ на этот вопрос заключается в том, что при сравнении двух разных типов данных механизм SQL неявно преобразует одно из значений на основе Приоритет типа данных .

В моем примере яЯ сравниваю целочисленное значение со значениями VARCHAR из столбца моей таблицы.Поскольку значения, хранящиеся в столбце 2, являются числовыми (они содержат только цифры), механизм SQl может преобразовать эти значения в INT и сравнить их со значениями INT в моем предложении WHERE.Таким образом, я получаю правильный набор результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...