在Go 中使用帶有切片的IN 子句查詢資料庫
在資料庫查詢中,通常使用基於值的子集來過濾結果IN 子句。然而,在 Go 中使用整數切片時,創建語法上有效且符合慣用語的 IN 子句可能具有挑戰性。
考慮以下查詢,該查詢嘗試從兩個連接表中檢索不同的標題。 IN 子句填入了名為 artIds 的切片的內容:
<code class="go">inq := "6,7" //strings.Join(artIds, ",") rows, err = db.Query("SELECT DISTINCT title FROM tags_for_articles LEFT JOIN tags ON tags.id = tags_for_articles.tag_id WHERE article_id IN (?)", inq)</code>
為簡潔起見,已省略錯誤處理。查詢失敗,因為database/sql將參數直接傳遞給驅動程序,驅動程式需要可變數量的bindvars,取決於切片的長度。
或者,使用靜態IN子句的查詢將成功執行:
<code class="go">rows, err = db.Query("SELECT DISTINCT title FROM tags_for_articles LEFT JOIN tags ON tags.id = tags_for_articles.tag_id WHERE article_id IN (6,7)", inq)</code>
此問題的解決方案是使用sqlx 庫,它提供了對資料庫查詢的更多控制。 sqlx.In 函數可用於處理帶有 IN 子句的查詢並動態建立必要的綁定變數:
<code class="go">var levels = []int{4, 6, 7} query, args, err := sqlx.In("SELECT * FROM users WHERE level IN (?);", levels)</code>
然後可以使用產生的查詢和參數來執行準備好的語句。使用 sqlx.In 函數可確保查詢在語法上有效,並且可以使用給定的值切片有效執行。
以上是如何在 Go 中使用切片透過 IN 子句查詢資料庫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!