MySQL, где условие только со ссылкой на столбец, что это значит? - PullRequest
0 голосов
/ 12 октября 2018

Примеры:

SELECT *
FROM table t
WHERE t.col1

SELECT *
FROM table t
WHERE t.col1 AND t.col2

В зависимости от характера столбца эти запросы ведут себя по-разному.В моих тестах, если столбец имеет целочисленный тип, я не буду показывать строки с 0 или нулями для этого столбца, если это строка, запрос не даст результата.

Я бы хотел понять, что это за типыгде условия означают.Не удалось найти ни спецификации для этого в руководстве по MySQL, ни объяснений в Интернете.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Это просто неправильные логические выражения.Булевы выражения оцениваются как true или false и имеют форму, например, where t.col1 = 0 and t.col2 >= 3.

Тот факт, что ваши операторы иногда возвращают данные, а иногда нет, объясняется тем, что 0 и 1 означают false иtrue соответственно.

Как вы уже заметили, 0 и NULL не возвращают строки, потому что они рассматриваются как ложные в случае 0 и не сравнимы в случае NULL.С другой стороны, строки неявно преобразуются в числа.Если строка начинается с числа, отличного от 0, строка преобразуется в это число в MySQL.Если строка начинается с чего-то другого, она конвертируется в 0. Поэтому вы не получаете результатов для строк.

Я бы порекомендовал не использовать эти "краткие логические выражения».Всегда пишите правильные выражения!

0 голосов
/ 12 октября 2018

В вашем запросе вы не назначаете правильное сравнение в предложении where (например: where t.col1 = 10) .. поэтому условие where пытается вычислить приведение к значению в столбцах, упомянутых как boolen

в этом случае различный результат просто основан на различном приведении к логическому типу каждого типа

, если вы запускаете запрос, основанный на целочисленном возвращении, всегда действительный истинный результат, так что вы получите все строки в других со строкой, зависящей отдля каждого строкового значения это не может привести к появлению ни одной строки, частичной строки или всех строк. попробуйте посмотреть результат для приведения вашего столбца в логических

    SELECT if(t.col1, true, false)
    FROM table t
    WHERE t.col1

и

    SELECT if( t.col1 AND t.col2, true,false)
    FROM table t
    WHERE t.col1 AND t.col2
...