Mysql SQL查询以查找跨列的尾随零数

Mysql SQL查询以查找跨列的尾随零数,mysql,sql,Mysql,Sql,我需要一个sql查询,该查询包含给定的表单值表 | id | day1 | day2 | day3 | day4 | day5 | | 1 | 4 | 0 | 5 | 0 | 0 | | 2 | 2 | 0 | 0 | 0 | 0 | 给予 也就是说,每个id的days列中的连续尾随零数(从day5向后)我采用暴力方法: CREATE TABLE #temp (id int, day1 int, day2 int, day3 in

我需要一个sql查询,该查询包含给定的表单值表

| id | day1 | day2 | day3 | day4 | day5 |
| 1  |  4   |  0   |  5   | 0    | 0    |
| 2  |  2   |  0   |  0   | 0    | 0    |
给予


也就是说,每个id的days列中的连续尾随零数(从day5向后)

我采用暴力方法:

CREATE TABLE #temp (id int, day1 int, day2 int, day3 int, day4 int, day5 int)
INSERT INTO #temp (id,day1,day2,day3,day4,day5) VALUES (1,4,0,5,0,0),(2,2,0,0,0,0)

SELECT id,
    CASE 
        WHEN day5=0 AND day4=0 AND day3=0 AND day2=0 AND day1=0 THEN 5
        WHEN day5=0 AND day4=0 AND day3=0 AND day2=0 THEN 4
        WHEN day5=0 AND day4=0 AND day3=0 THEN 3
        WHEN day5=0 AND day4=0 THEN 2
        WHEN day5=0 THEN 1
        ELSE 0
        END AS ConsecutiveTrailingZeros
FROM #temp
当然,如果您需要将100计算为两个连续的零,那么这种方法将失败。这是SQL Server语法。可能需要调整MySQL


但是,是的,我相当肯定无论你在做什么,你的方法都是次优的。

这里是可能的解决方案

select id,
   length(@k:=concat(day1,day2,day3,day4,day5&&1)) 
    - length(trim(trailing '0' from @k)) as trailing_zeros 
from days_table

我喜欢这样的东西。当然,这是假设您只有5天:

SELECT
  id,
  CASE WHEN day5 = 0 THEN
    CASE WHEN day4 = 0 THEN
      CASE WHEN day3 = 0 THEN
        CASE WHEN day2 = 0 THEN
          CASE WHEN day1 = 0 THEN 5
          ELSE 4 END
        ELSE 3 END
      ELSE 2 END
    ELSE 1 END
  ELSE 0 END
  amount_of_zeros
FROM t

糟糕透了,不是吗?

这个版本的灵感来自@yaroslavpgrebnyak的答案

  • 它是
    NULL
    安全的(如果碰巧列可以为NULL)
  • 如果值本身有尾随零(例如10、20、300等),则不会中断
  • 它不使用用户(会话)变量
  • 选择id、字符长度(
    子串索引(
    康卡特(第10天,
    第20天,
    第30天,
    第40天,
    第50天),
    '0', -1)
    )尾随零
    来自表1
    
    让我们试一下:

    mysql>创建表table1(id int、day1 int、day2 int、day3 int、day4 int、day5 int);
    查询正常,0行受影响(0.05秒)
    mysql>插入到表1(id,day1,day2,day3,day4,day5)值中
    -> (1, 4, 0, 5, 0, 0),
    -> (2, 2, 0, 0, 0, 0),
    -> (3, 0, 1, 10, 100, 1000),
    ->(4,2,NULL,0,0,0);
    查询正常,4行受影响(0.01秒)
    记录:4个重复:0警告:0
    mysql>选择id、字符长度(
    ->子串索引(
    ->康卡特(第10天,
    ->第20天,
    ->第30天,
    ->第40天,
    ->第50天),
    ->                '0', -1)
    ->)尾随零
    ->来自表1;
    +------+----------------+
    |id |尾随_零|
    +------+----------------+
    |    1 |              2 |
    |    2 |              4 |
    |    3 |              0 |
    |    4 |              3 |
    +------+----------------+
    一组4行(0.01秒)
    

    这是第867820天的演示,该列是否命名为第867820天?您使用的是什么数据库管理系统?SQL代表结构化查询语言。对不起,它是mysql。是的,列名以这种形式存在超过5天?如果第2天的值为“10”呢。这算“尾随”零吗?如果第5天的值为
    1000
    ,该怎么办。这将返回3,即使它应该返回0如果第5天的值为1000000会怎么样。这将返回5,即使它应该返回0。还要注意的是MySQL。关于你的第一种方法,你似乎把它复杂化了。重读我现在看到的问题。“跟踪零”的描述没有点击,但我现在明白了。编辑解决方案。一个挥之不去的问题,描述没有明确,是:如果第5天是0,答案总是0吗?或者解决方案应该返回最后一个0值跨度的计数吗?让OP回答这个问题
    SELECT
      id,
      CASE WHEN day5 = 0 THEN
        CASE WHEN day4 = 0 THEN
          CASE WHEN day3 = 0 THEN
            CASE WHEN day2 = 0 THEN
              CASE WHEN day1 = 0 THEN 5
              ELSE 4 END
            ELSE 3 END
          ELSE 2 END
        ELSE 1 END
      ELSE 0 END
      amount_of_zeros
    FROM t