【问题标题】:How to check if column added in SELECT is null, if yes -> don't print this如何检查 SELECT 中添加的列是否为空,如果是 -> 不打印
【发布时间】:2019-01-27 11:20:34
【问题描述】:

我正在尝试打印超重或体重不足的球员的 BMI 值。如果玩家没有任何问题,那么我不想打印这一行。如果玩家正常,我将“Problems_with_weight”列设置为空。

我已经尝试将新列声明为 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 

【问题讨论】:

  • 顺便说一句:你换了超重减持。

标签: sql select firebird


【解决方案1】:

您可以使用 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

【讨论】:

    【解决方案2】:

    您可以使用自动计算的列。此外,只计算一次 BMI 值并且不要一次又一次地重新计算(查询中每行 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'  )
      ) 
    

    那么你将有两个选择。

    懒惰一-全表扫描:

    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
    

    【讨论】:

      猜你喜欢
      • 2021-04-28
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      • 2013-05-09
      • 2014-04-13
      相关资源
      最近更新 更多