条件 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;
我有一个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;