我需要在2行的组中选择第一个非空值。我查看了许多站点和答案,但是没有找到符合我要求的解决方案。这是我的故事:
CREATE TABLE `stacks` (
`id` int(11) NOT NULL,
`aisle` varchar(10) NOT NULL,
`p1` int(11) DEFAULT NULL,
`p2` int(11) DEFAULT NULL,
`p3` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `stacks` (`id`, `aisle`, `p1`, `p2`, `p3`) VALUES
(1, 'Last', 20, 30, 40),
(2, 'One', NULL, 12, NULL),
(3, 'Two', 6, 9, NULL),
(4, 'Three', NULL, NULL, 18);
我正在寻找给定行中的项目数量,但是如果该数字为NULL,我想回退到Last
中的数量。这应该分别针对每个P列发生。例如,假设我要在过道3中查找项目数量,如果任何项目为NULL,我想改为选择last
中的值。
aisle
的三个结果集应类似于:
aisle p1 p2 p3
Three 20 30 18
或者第二通道的结果应该是
aisle p1 p2 p3 Two 6 9 30
我尝试过的。我首先尝试选择p1,p2或p3不为NULL的位置,但这显然不适用于多列。
然后,我尝试使用一种方法尝试将NULL和NOT NULL值分离到单独的列中,以便我可以使用合并。但是我很快发现,无论顺序如何,都只会选择第一行。
SELECT aisle,
CASE WHEN `aisle` != 'last' THEN p1 END AS pa,
CASE WHEN `aisle` = 'last' THEN p1 END AS pb
FROM `stacks`
WHERE aisle = 'three' OR aisle = 'last'
GROUP BY aisle
ORDER BY id DESC
我研究了HAVING,多重选择,联合,甚至尝试了GROUP_CONCAT在单个字段中对值进行排序。这可能是我最成功的,因为我能够在连接字符串中首先列出所需的值,但是我找不到在MySQL中隔离适当值的可管理方法。
无论如何,在MySql中似乎不存在诸如first_value()之类的方法,但是我不相信在此版本中有实现此目的的方法。我不能再花时间在墙上撞我的头了,希望您能以一种或另一种方式使我挺直。
谢谢!
答案 0 :(得分:3)
使用自联接获取last
值。然后使用IFNULL()
作为备用。
SELECT s.aisle, IFNULL(s.p1, l.p1) AS p1, IFNULL(s.p2, l.p2) AS p2, IFNULL(s.p3, l.p3) AS p3
FROM stacks AS s
CROSS JOIN stacks AS l
WHERE s.aisle != 'last' AND l.aisle = 'last'
答案 1 :(得分:1)
我认为您可以执行JOIN
并合并行。例如:
select
s.id,
s.aisle,
coalesce(s.p1, l.p1) as p1,
coalesce(s.p2, l.p2) as p2,
coalesce(s.p3, l.p3) as p3
from stacks s
cross join stacks l
where l.aisle = 'Last'
and s.aisle <> 'Last'