簡體   English   中英

MySQL從多行中選擇第一個非空值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM