当你有多个 SQL 语句具有相同的查询模式但不同的参数值时,可以通过以下几种方法合并它们:
SELECT * FROM users
WHERE user_id IN (1, 2, 3, 4, 5);
替代多个:
SELECT * FROM users WHERE user_id = 1;
SELECT * FROM users WHERE user_id = 2;
-- 等等...
SELECT
user_id,
CASE
WHEN user_id = 1 THEN 'Admin'
WHEN user_id = 2 THEN 'Editor'
WHEN user_id = 3 THEN 'Viewer'
ELSE 'Unknown'
END AS role
FROM users
WHERE user_id IN (1, 2, 3);
SELECT 'query1' AS query_type, COUNT(*) FROM table1 WHERE condition1
UNION ALL
SELECT 'query2' AS query_type, COUNT(*) FROM table1 WHERE condition2
UNION ALL
SELECT 'query3' AS query_type, COUNT(*) FROM table2 WHERE condition3;
# Python 示例
user_ids = [1, 2, 3, 4, 5]
query = "SELECT * FROM users WHERE user_id IN (%s)" % ','.join(['?']*len(user_ids))
cursor.execute(query, user_ids)
-- 使用临时表
CREATE TEMPORARY TABLE temp_ids (id INT);
INSERT INTO temp_ids VALUES (1), (2), (3), (4), (5);
SELECT u.* FROM users u JOIN temp_ids t ON u.user_id = t.id;
-- 使用 CTE
WITH ids AS (
SELECT 1 AS id UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5
)
SELECT u.* FROM users u JOIN ids i ON u.user_id = i.id;
-- MySQL 存储过程示例
DELIMITER //
CREATE PROCEDURE get_multiple_users(IN id_list VARCHAR(255))
BEGIN
SET @sql = CONCAT('SELECT * FROM users WHERE user_id IN (', id_list, ')');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
-- 调用
CALL get_multiple_users('1,2,3,4,5');
选择哪种方法取决于你的具体需求、数据库系统以及查询的复杂性。IN 操作符是最简单直接的方法,而临时表和 CTE 则更适合复杂场景。