кто-нибудь может объяснить разницу между » WHERE CAST(SUBSTR(M.year, -4) AS UNSIGNED) < 1970" и "m.year<1970"

#sql #sqlite #substring

#sql #sqlite #подстрока

Вопрос:

Я работаю с sqlite в записной книжке goole colab. У меня есть идентификатор печатного актера, который работал до 1970 года. И это мой sql-запрос

 SELECT  PID FROM M_Cast mc JOIN Movie m on mc.MID=m.MID WHERE m.year< 1970;
 

Но у меня это не очень хорошо получилось (я не получил точного результата). Но когда я редактирую свой запрос на

 SELECT  PID FROM M_Cast mc JOIN Movie m on mc.MID=m.MID WHERE CAST(SUBSTR(M.year,-4) AS UNSIGNED) < 1970;
 

Я получаю точный результат, может ли кто-нибудь объяснить разницу между этими утверждениями CAST(SUBSTR(M.year,-4) AS UNSIGNED) < 1970 и m.year<1970 .

Комментарии:

1. Я удалил несовместимые теги базы данных. Пожалуйста, помечайте только используемую вами базу данных. Образцы данных и желаемые результаты также помогут, поэтому ясно, что означает «другой ответ». И каков тип year ? В одном контексте он используется как число, а в другом — как строка.

Ответ №1:

Было бы нормально, если бы столбец с именем year хранил целочисленные 4-значные значения, но поскольку ваш 1-й запрос не работает, это означает, что это не так.

Кроме того, поскольку ваш 2-й запрос работает, это означает, что последние 4 символа столбца содержат год, в котором был снят каждый фильм.

Поэтому проверьте столбец year в таблице Movie на наличие нецелочисленных значений.
Простой способ сделать это с помощью:

 SELECT * FROM Movie WHERE LENGTH(year) > 4