Как я могу найти, какие столбцы в таблице имеют нулевые значения в MySQL?

#mysql

Вопрос:

У меня есть таблица с именем «Стек», в которой много столбцов, но я хочу знать только имена столбцов, которые имеют минимальное null значение 1.

введите описание изображения здесь

Ожидаемым результатом должно быть название столбцов «Рейтинг» и «Голос», так как в столбцах есть по крайней мере одно null значение.

Выход:

Повышение рейтинга

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

1. Пожалуйста, будьте более конкретны. Приведите пример таблицы с ожидаемыми результатами. Это может быть что — то вроде SELECT name FROM Stack WHERE value=0

2. @Jakob: Имена столбцов, а не содержимое столбца. К тому же 0 и null это совершенно разные вещи.

3. Привет, Якоб, я обновил свой вопрос, надеюсь, это даст вам некоторое четкое представление о моих требованиях.

Ответ №1:

Если вы хотите, чтобы в результатах 1 строка для каждого столбца имела хотя бы 1 NULL значение, используйте EXISTS для проверки и UNION ALL :

 SELECT 'Question_asked' FROM dual WHERE EXISTS (SELECT 1 FROM stack WHERE Question_asked IS NULL)
UNION ALL
SELECT 'Answered' FROM dual WHERE EXISTS (SELECT 1 FROM stack WHERE Answered IS NULL)
UNION ALL
SELECT 'Rating' FROM dual WHERE EXISTS (SELECT 1 FROM stack WHERE Rating IS NULL)
UNION ALL
SELECT 'Upvote' FROM dual WHERE EXISTS (SELECT 1 FROM stack WHERE Upvote IS NULL)
 

Вы можете удалить FROM dual , если ваша версия MySQL 8.0 .

Я бы предложил получить результаты в 1 строке 1 для каждого столбца, имеющего по крайней мере 1 NULL значение:

 SELECT EXISTS (SELECT 1 FROM stack WHERE Question_asked IS NULL) Question_asked,
       EXISTS (SELECT 1 FROM stack WHERE Answered IS NULL) Answered,
       EXISTS (SELECT 1 FROM stack WHERE Rating IS NULL) Rating,
       EXISTS (SELECT 1 FROM stack WHERE Upvote IS NULL) Upvote
 

Или:

 SELECT MAX(Question_asked IS NULL) Question_asked,
       MAX(Answered IS NULL) Answered,
       MAX(Rating IS NULL) Rating,
       MAX(Upvote IS NULL) Upvote
FROM stack
 

Смотрите демонстрацию.

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

1. Насколько я понимаю, это так » … таблица с именем «Стек», в которой много столбцов… «означает, что показанная структура является лишь примером.

2. @PM77-1 Я это понимаю. Каждую колонку необходимо проверять отдельно.

3. @PM77-1 Нет, все равно каждую колонку нужно проверять отдельно. Единственное различие будет заключаться в том, что имена столбцов будут выбираться системой.

Ответ №2:

сделайте что-то подобное, адаптируясь к вашей проблеме :

     delimiter |
create procedure DisplayResult() 
begin
declare v_rate_count int;
declare v_upvote_count int;
select count(rating) into v_rate_count from stack where rating is null;
select count(upvote) into v_upvote_count from stack where updvote is null;

if v_rate_count < v_upvote_count then
    select 'rating' union select 'upvote';
else
    select 'upvote' union select 'rating';
    end if; 
    
end |
delimiter ;
 

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

1. Вы посмотрели на ожидаемый результат?