![](/img/trans.png)
[英]MySQL Return the first non-NULL value from the list of the column in select statement with column name
[英]MySQL Selecting First Non-Null Value from Multiple Rows
我需要在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()之類的方法,但是我不相信在此版本中有實現此目的的方法。 我不能再花時間在牆上撞我的頭了,希望您能以一種或另一種方式使我挺直。
謝謝!
使用自聯接獲取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'
我認為您可以進行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'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.