Как проверить, является ли столбец, добавленный в SELECT, пустым, если да -> не печатать это - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь напечатать значения ИМТ игроков с избыточным или недостаточным весом. Если у игрока нет проблем, я не хочу печатать эту строку. Я установил ноль в столбец «Проблемы с весом», если игрок в порядке.

Я уже пытался объявить новый столбец как PROBLEMS_WITH_WEIGHT, а затем проверить WHERE выражение: WHERE PROBLEMS_WITH_WEIGHT IS NOT NULL, но он говорит, что не знает, что PROBLEMS_WITH_WEIGHT означает

SELECT p.name, p.surename, p.weight * 10000.00 / (p.height*p.height)  as BMI,
CASE
    WHEN p.weight * 10000.00 / (p.height*p.height) <= 18.5 **THEN** 'OVERWEIGHT'
    WHEN p.weight * 10000.00 / (p.height*p.height) >= 25 **THEN** 'UNDERWEIGHT'
    ELSE NULL
END AS PROBLEMS_WITH_WEIGHT
FROM PLAYERS p  
ORDER BY BMI DESC 

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Вы можете использовать автоматически вычисляемые столбцы.Также имеет смысл рассчитывать значение ИМТ только один раз и не пересчитывать его снова и снова (3 раза на каждую строку в вашем запросе).

Итак, шаг за шагом:

alter PROBLEMS_WITH_WEIGHT add BMI float 

Тогда

create trigger materialize_BMI 
active before update or insert on PROBLEMS_WITH_WEIGHT
as begin
  NEW.BMI = NEW.weight * 10000.00 / (NEW.height*NEW.height) ;
end

Теперь для каждой новой или измененной строки вы должны рассчитать и сохранить BMI.Вы можете инициализировать столбец, представив обновление всей таблицы: UPDATE PROBLEMS_WITH_WEIGHT set BMI = BMI

Затем

alter PROBLEMS_WITH_WEIGHT add BMI_STATUS computed by 
  ( DECODE( BMI <= 18.5, 'UNDERWEIGHT' ,
            BMI >= 25,   'OVERWEIGHT'  )
  ) 

Тогда у вас будет два варианта.

Lazy one - full tableотсканируйте:

Select * from PROBLEMS_WITH_WEIGHT where BMI_STATUS is not NULL

Подробно (таким образом, склонны к опечаткам), но потенциально быстрее:

Create index IDX_BMI_PROBLEMS on PROBLEMS_WITH_WEIGHT(BMI);

Затем

Select * from PROBLEMS_WITH_WEIGHT where BMI <= 18.5
  UNION ALL
Select * from PROBLEMS_WITH_WEIGHT where BMI > 25
0 голосов
/ 27 января 2019

Вы можете использовать предложение WHERE, чтобы отфильтровать игроков, у которых нет проблем с BMI.

Кроме того, вычисление BMI можно перенести в подзапрос, чтобы избежать повторения вычисления.

Наконец, ветвь «ELSE NULL» в данном случае является излишней, так как CASE возвращает NULL по умолчанию, если ветвь не совпадает (что в любом случае не произойдет в этом запросе из-за недавно добавленного предложения WHERE).

Запрос:

SELECT 
    p.*,
    CASE
        WHEN p.bmi <= 18.5 THEN 'OVERWEIGHT'
        WHEN p.bmi >= 25 THEN 'UNDERWEIGHT'
    END AS PROBLEMS_WITH_WEIGHT 
FROM (
    SELECT 
        name, 
        surname, 
        weight * 10000.00 / (height*height) bmi 
    FROM players 
) p
WHERE p.bmi <= 18.5 OR p.bmi >= 25
ORDER BY p.bmi DESC
...