【问题标题】:Substitute or replacing value in MySQL query from another column从另一列替换或替换 MySQL 查询中的值
【发布时间】:2016-04-21 16:23:59
【问题描述】:

如何将 MySQL 查询中的 NULL 值替换或替换为我需要的值?

如果为 null 或 coleasce 或 with case 或 with if? 我无法让它工作。

示例在SQL Fiddle

  • 第一行和第二行:

    • 第三列:所有产品的总和;
    • 第四栏:活跃产品;
    • 第五列:无效产品。
  • 第三行和第四行:

    • 第三列:所有产品的总和;
    • 第四栏:活跃产品;
    • 第五列:非活动产品(NULL 值 => 需要 0 值)。
  • 第五和第六行:

    • 第三列:所有产品的总和;
    • 第四栏:活跃产品(NULL 值 => 需要0 值);
    • 第五列:无效产品(NULL 值 => 需要第三列中的值)。

如果我获得非活动产品的 NULL 值,我需要将其替换为 0,但是当我在活动产品中获得 NULL 值时,我需要将其替换为 0 并在非活动列中替换NULL 值与第三列中的值。

没有UPDATEINSERT 函数,因为这是一个MySQL 视图。


基本上我需要的是:

if active <> 0 and inactive <> 0
then 'no value change'

if active <> 0 and inactive = null
then inactive = 0

if active = null
then active = 0 and inactive = product_sum

【问题讨论】:

    标签: mysql null substitution


    【解决方案1】:

    我们可以使用 表达式 代替 SELECT 列表中的列名。

    如果我们希望 SQL 可移植且符合 ANSI 标准,我们可以使用 CASE 表达式。例如:

      SELECT CASE WHEN t.inactive_product IS NULL
               THEN t.product_sum
               ELSE t.inactive_product 
             END AS inactive_product
        FROM ... t
    

    使用COALESCE 函数可以获得(更简洁的)等效结果:

      SELECT COALESCE(t.inactive_product,t.product_sum) AS inactive_product
           , COALESCE(t.active_product,0)               AS active_product
        FROM ... t
    

    包括 MySQL 在内的大多数数据库都提供了扩展 SQL 标准的函数。

    在 MySQL 中使用方便的IFNULL 函数可以实现相同的结果。

      SELECT IFNULL(t.inactive_product,t.product_sum) AS inactive_product
           , IFNULL(t.active_product,0)               AS active_product
        FROM ... t
    

    跟进:

    在我看来,以下条件在数据中往往为真,或者至少在我们想要返回的结果中:

     product_sum = active_product + inactive_product
    

    我会这样做:

    SELECT ... 
         , t.product_sum
         , IFNULL(t.active_product,0) AS active_product
         , IFNULL(t.inactive_product,t.product_sum-IFNULL(t.active_product,0))
           AS inactive_product
     FROM ... t
    

    【讨论】:

    • 抱歉这个愚蠢的问题。查询时是否可以有多个案例?这是我唯一没有尝试过的事情
    猜你喜欢
    • 1970-01-01
    • 2021-11-09
    • 2013-12-11
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多