Как бороться с подзапросом, возвращающим null

Я хочу запустить родительский выбор только в том случае, если подзапрос не равен нулю. Не знаете, как этого добиться с помощью sql-запроса: -

SELECT * from schools 
    WHERE `district_id` =
    (SELECT district_id from schools WHERE `school_id` = '0023194')

Это то, что делает ваш запрос. Полезны образцы данных и желаемые результаты.

Gordon Linoff 31.07.2018 20:02

если SELECT District_id из школ WHERE school_id = '0023194' возвращает null, я получаю каждую строку из школ

Sam Luther 31.07.2018 20:03

Если SELECT District_id из школ WHERE school_id = '0023194' возвращает идентификатор, я получаю строки с этим идентификатором района

Sam Luther 31.07.2018 20:04

Проверить SELECT COALESCE - w3schools.com/sql/func_sqlserver_coalesce.asp

Akrion 31.07.2018 20:06

Если подзапрос имеет значение NULL, операция = не может быть истинной (даже если district_id также имеет значение NULL), и родительский запрос не возвращает строки. Значит, он уже делает то, что вы хотите, не так ли?

sticky bit 31.07.2018 20:12

он возвращает все строки, у которых нет значения District_id, и это то, чего я хочу избежать

Sam Luther 31.07.2018 20:15

Итак, SELECT District_id из школ WHERE school_id = '0023194' возвращает null, затем SELECT * из школ WHERE district_id = null возвращает строки без идентификаторов округов. Я не хочу этого. Я бы хотел, чтобы внешний запрос запускался, если подзапрос возвращает значение, а не нуль

Sam Luther 31.07.2018 20:20

Я очень сомневаюсь, что, поскольку NULL = NULL не соответствует действительности, ни одна строка не удовлетворяет этому условию, и внешний запрос не возвращает ни одной строки, а не всех. По крайней мере, так должно быть. Можете ли вы создать скрипку, которая показывает противоположное поведение, о котором вы заявляете?

sticky bit 31.07.2018 20:23

Подождите ... У вас нет строки 'NULL' в этом столбце, не так ли? Или пустая строка? Потому что это не значения NULL и объясняют описываемое вами поведение ... В этом случае очистите данные и используйте (настоящий) NULL вместо этих строк.

sticky bit 31.07.2018 20:26

@stickybit Sonofabitch! пустая строка. Благодарность

Sam Luther 31.07.2018 20:37

@SamLuther Если у вас пустая строка, я думаю, что указанное поведение по-прежнему не ожидается.

Md. Suman Kabir 31.07.2018 20:41

@ Md.SumanKabir, вы правы, я удалил пустую строку, проблемы остались прежними

Sam Luther 31.07.2018 20:50

@SamLuther Зайдите в мой Скрипка и создайте проблему.

Md. Suman Kabir 31.07.2018 20:53

@ Md.SumanKabir спасибо, но у stickybit все было правильно. использование (настоящего) NULL помогло

Sam Luther 31.07.2018 21:00
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
14
494
3

Ответы 3

вы должны запустить свой sql-запрос, например ...

SELECT * from schools 
WHERE `district_id` = 
(SELECT district_id from schools 
    WHERE `school_id` = '0023194'
    AND 
    district_id IS NOT NULL) 
AND district_id IS NOT NULL

district_id IS NOT NULL to prevent district_id not null

Не то, что я ищу, этот запрос возвращает то же количество строк, что и SELECT * из школ WHERE district_id = (SELECT District_id из школ WHERE school_id = '0023194')

Sam Luther 31.07.2018 20:13

Кажется, вам просто нужно использовать IN, как показано ниже:

SELECT * from schools 
WHERE `district_id` in
(SELECT district_id from schools WHERE `school_id` = '0023194')

SQL ЗДЕСЬ

Я пробовал это, нет, по-прежнему возвращает строки с District_id, которые равны нулю

Sam Luther 31.07.2018 20:22

Кажется, что-то не так с вашей базой данных! Проверьте скрипку и создайте проблему, с которой вы столкнулись. sqlfiddle.com/#!9/9440a2/2

Md. Suman Kabir 31.07.2018 20:32

Вы можете использовать оператор IN, потому что оператор IN позволяет указать несколько значений в предложении WHERE.

Оператор IN - это сокращение для нескольких условий ИЛИ. В вашем условии = сравнивает только одно условие, но если у вас есть несколько записей этого school_id, = не может его оценить.

SELECT * from schools WHERE `district_id` in (SELECT district_id from schools WHERE `school_id` = '0023194')

Другие вопросы по теме