首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL 多條件查詢:IN 子句與動態 SQL 實現批量防偽碼查詢

     編輯:程式設計綜合問答

需求

輸入多個防偽碼(如 123,456,789),一次查詢返回所有匹配商品的名稱與價格。

方案一:IN 子句(最簡單)

SELECT product_name, price 
FROM products 
WHERE anti_fake_code IN ('123', '456', '789');
  • 適用於靜態列表或參數數量較少(<1000)的場景。
  • 參數化查詢防注入:WHERE anti_fake_code IN (?, ?, ?),動態生成佔位符。

方案二:臨時表/表值參數(大批量)

-- SQL Server
CREATE TYPE dbo.CodeList AS TABLE (code VARCHAR(50));
-- 應用層填充 DataTable 傳入存儲過程
SELECT p.product_name, p.price
FROM products p
JOIN @CodeList c ON p.anti_fake_code = c.code;
  • 避免 SQL 過長、計劃緩存污染、IN 列表限制(SQL Server 2100 參數上限)。
  • MySQL/PostgreSQL 可用 CREATE TEMPORARY TABLE 或 UNNEST(ARRAY[...])。

方案三:應用層分批查詢再合併(通用)

List allCodes = Arrays.asList(input.split(","));
List result = new ArrayList<>();
for (List batch : Lists.partition(allCodes, 500)) {
    String placeholders = batch.stream().map(c -> "?").collect(Collectors.joining(","));
    String sql = "SELECT product_name, price FROM products WHERE anti_fake_code IN (" + placeholders + ")";
    result.addAll(jdbcTemplate.query(sql, batch.toArray(), rowMapper));
}

前端交互建議

  • 輸入框支持換行/逗號/空格分隔,前端正則分割去重。
  • 顯示「已識別 N 個碼」,超過限制提示分批查詢。
  • 結果表格支持導出 Excel。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved