条件 select 查询列中的值是否为空

Condtional select query if a value in coulmn is empty

我有一个table

并且我正在尝试为相同的 type 值编写一个具有 ifnull 条件的 select 语句,以获得如此 table[= 所示的结果21=]

下面是我试过的sql-

SELECT type, memo, IFNULL( memo, type = type) memo_all, amount FROM table

但我得到的结果与 memo_all 列中的 memo 列相同,上面的查询可以在 table 3. Please find the sqlfiddle here with above query and table - http://sqlfiddle.com/#!9/55c43f

中看到

我在这里错过了什么?有没有其他方法可以得到如 table 2?

所示的结果

使用window个函数:

SELECT type, memo,
       max(memo) over (partition by type) as memo_all
       amount
FROM table;

您想“借用”另一行的值。一个简单的标量函数不会这样做。然而,window 函数提供了这种能力。

编辑:

在 MySQL 的旧版本中,您可以使用相关子查询:

SELECT type, memo,
       COALESCE(memo,
                (SELECT t2.memo
                 FROM table t2
                 WHERE t2.type = t.type AND t2.memo IS NOT NULL
                 LIMIT 1
                )
               ) as memo_all
       amount
FROM table t;

以防万一您使用的 MySQL 版本早于 8+,这里是 Gordon 的答案的替代方法,它不使用 window 函数:

SELECT
    t1.type,
    t1.memo,
    t2.memo AS memo_all,
    t1.amount
FROM yourTable t1
INNER JOIN
(
    SELECT type, MAX(memo) AS memo
    FROM yourTable
    GROUP BY type
) t2
    ON t1.type = t2.type;
SELECT t1.*, t2.memo memo_all
FROM `table` t1
JOIN `table` t2 USING (type)
WHERE t2.memo != '';

使用一个来源的解决方案table复制:

SELECT `table`.*, @tmp := CASE WHEN memo = '' THEN @tmp ELSE memo END memo_all
FROM `table`, (SELECT @tmp := '') variable
ORDER BY type, memo DESC;