Mysql SQL查询以查找跨列的尾随零数
我需要一个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
| 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)选择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