插件窝 干货文章 如何合并多个包含相同查询模式的 SQL 语句?

如何合并多个包含相同查询模式的 SQL 语句?

SELECT user users 使用 534    来源:    2025-03-30

合并多个包含相同查询模式的 SQL 语句

当你有多个 SQL 语句具有相同的查询模式但不同的参数值时,可以通过以下几种方法合并它们:

1. 使用 IN 操作符

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;
-- 等等...

2. 使用 CASE 表达式

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);

3. 使用 UNION ALL(当查询结构不同但需要合并结果时)

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;

4. 使用参数化查询(在应用程序中)

# 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)

5. 使用临时表或 CTE (Common Table Expression)

-- 使用临时表
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;

6. 使用动态 SQL(在存储过程中)

-- 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 则更适合复杂场景。