【问题标题】:Numeric calculation from VARCHAR fields in MySQLMySQL中VARCHAR字段的数值计算
【发布时间】:2013-12-27 19:07:11
【问题描述】:

我有一个(简化的)结果表:

id | Result1 | Result2 | Progress
---------------------------------
1  | 1b      | 3c      | NULL
2  | 2c      | 2a      | NULL
3  | 3c      | 2b      | NULL
4  | P3      | 2c      | NULL
5  | 2c      | A       | NULL

我想根据 Result1 和 Result2 列的数字部分(始终是第一个字符)之间的差异来填充 Progress 列。如果任一结果列的第一个字符不是数字,则 Progress 列应为 NULL。

所以上表的结果应该是

3c - 1b = 2
2a - 2c = 0
2b - 3c = -1
2c - P3 = NULL
A - 2c = NULL

感谢您的帮助。

【问题讨论】:

标签: mysql


【解决方案1】:

感谢那些回复的人,这里的快速回复为我指明了正确的方向 - 这就是我想出的:

UPDATE mytable SET Progress =
    CASE
        WHEN CAST(Result1 AS SIGNED) > 0 AND CAST(Result2 AS SIGNED) > 0
            THEN CAST(Result2 AS SIGNED) - CAST(Result1 AS SIGNED)
        ELSE NULL
    END

【讨论】:

    【解决方案2】:
    update table_name
    set progress=if(left(Result2,1)regexp'[:alpha:]'=1,null,left(Result2,1))-if(left(Result1,1)regexp'[:alpha:]'=1,null,left(Result1,1)) ;
    

    【讨论】:

      【解决方案3】:

      试试CASELEFT()

      SELECT *,
      (CASE WHEN
      LEFT(Result1 ,1) - LEFT(Result2 ,1) >=0 OR 
      LEFT(Result1 ,1) - LEFT(Result2 ,1) <=0
      THEN LEFT(Result1 ,1) - LEFT(Result2 ,1)
      ELSE NULL END ) `result`
      FROM table
      

      编辑

      首先检查第一个值是否为数字然后计算

      SELECT *,
      
      (CASE WHEN
      
      CONCAT('',LEFT(Result1 ,1) * 1)  =0 THEN NULL
      
      WHEN CONCAT('',LEFT(Result2 ,1) * 1)  =0 THEN NULL
      
      WHEN LEFT(Result2 ,1) - LEFT(Result1 ,1) >=0 OR 
      
      LEFT(Result2 ,1) - LEFT(Result1 ,1) <=0
      
      THEN LEFT(Result2 ,1) - LEFT(Result1 ,1)
      
      ELSE NULL END ) `result`
      
      FROM `progress`
      

      LEFT(str,len)

      See working fiddle

      【讨论】:

      • 谢谢,因为两个结果列之间的差异可能为 0,所以不太会这样做(请参阅我的问题中的第二个示例)。
      【解决方案4】:
      UPDATE table
         SET Progress = IF(Result1 RLIKE '^[0-9]' AND Result2 RLIKE '^[0-9]', Cast(Result1 AS SIGNED) - Cast(Result2 AS SIGNED), NULL);
      

      【讨论】:

      • 嗯,这个答案没有解决问题。
      • 抱歉,这不适用于上表中的第四行,即第一个字母不是整数。
      • 没问题,我编辑它以考虑非数字输入;在这种情况下,它将为第三列生成 NULL。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 2012-09-02
      • 1970-01-01
      相关资源
      最近更新 更多