Mysql 8 如何在存储过程中使用 if 和使用 cte
Mysql 8 How to use an if inside a stored procedure and using cte
我在存储过程中使用 CTE,它工作正常,但问题是当我尝试添加条件时,我收到以下消息:
You have an error in your sql ..
Syntax to use near 'IF.
CREATE PROCEDURE referrals(LEVEL INT, max_level INT, code VARCHAR(25))
WITH RECURSIVE referrals_path (id, NAME, CODE, lvl) AS
(
SELECT c.id, c.name, c.code, 0 AS lvl
FROM users c
WHERE c.code = code UNION ALL
SELECT c.id, c.name, c.code, cp.lvl + 1
FROM category_path AS cp
JOIN users AS c ON cp.code = c.referred
)
IF LEVEL > 1 THEN
SELECT * FROM referrals_path;
ELSE
SELECT * FROM referrals_path WHERE lvl = LEVEL;
END IF
您不能在查询中使用 IF
语句。它旨在根据条件执行 SQL 代码块,而不是在查询中使用。
不过,我认为您可以按如下方式重新表述您的查询:
WITH RECURSIVE referrals_path (id, NAME, CODE, lvl) AS (
SELECT c.id, c.name, c.code, 0 AS lvl
FROM users c
WHERE c.code = code UNION ALL
SELECT c.id, c.name, c.code, cp.lvl + 1
FROM category_path AS cp
JOIN users AS c ON cp.code = c.referred
)
SELECT *
FROM referrals_path
WHERE LEVEL > 1 OR lvl = LEVEL
我在存储过程中使用 CTE,它工作正常,但问题是当我尝试添加条件时,我收到以下消息:
You have an error in your sql ..
Syntax to use near 'IF.
CREATE PROCEDURE referrals(LEVEL INT, max_level INT, code VARCHAR(25))
WITH RECURSIVE referrals_path (id, NAME, CODE, lvl) AS
(
SELECT c.id, c.name, c.code, 0 AS lvl
FROM users c
WHERE c.code = code UNION ALL
SELECT c.id, c.name, c.code, cp.lvl + 1
FROM category_path AS cp
JOIN users AS c ON cp.code = c.referred
)
IF LEVEL > 1 THEN
SELECT * FROM referrals_path;
ELSE
SELECT * FROM referrals_path WHERE lvl = LEVEL;
END IF
您不能在查询中使用 IF
语句。它旨在根据条件执行 SQL 代码块,而不是在查询中使用。
不过,我认为您可以按如下方式重新表述您的查询:
WITH RECURSIVE referrals_path (id, NAME, CODE, lvl) AS (
SELECT c.id, c.name, c.code, 0 AS lvl
FROM users c
WHERE c.code = code UNION ALL
SELECT c.id, c.name, c.code, cp.lvl + 1
FROM category_path AS cp
JOIN users AS c ON cp.code = c.referred
)
SELECT *
FROM referrals_path
WHERE LEVEL > 1 OR lvl = LEVEL