MySQL从多行中选择第一个非空值

时间:2019-03-18 20:31:51

标签: mysql select

我需要在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()之类的方法,但是我不相信在此版本中有实现此目的的方法。我不能再花时间在墙上撞我的头了,希望您能以一种或另一种方式使我挺直。

谢谢!

2 个答案:

答案 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'