Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để chuyển một lát [] sang điều kiện IN trong một câu lệnh SQL đã chuẩn bị sẵn với điều kiện không phải IN?

Tuy nhiên, có một giải pháp. Trước hết, vì chúng ta có thể chỉ có một tham số phát nổ duy nhất và không có tham số khác, trước tiên chúng ta nên đặt các tham số của mình lại với nhau trong một []slice duy nhất :

var params []interface{}
params = append(params, Type)
for _, subtype := range SubTypes {
  params = append(params, SubTypes)
}

Vì SQL sẽ không tự mở rộng, hãy mở rộng vòng lặp đó:

var params []interface{}
params = append(params, Type)
inCondition := ""
for _, subtype := range SubTypes {
  params = append(params, SubTypes)
  if inCondition != "" {
    inCondition += ", "
  }
  inCondition += "?"
}

Giả sử SubTypes chứa []int{1,2,3} , inCondition bây giờ nên chứa ?, ?, ? .

Sau đó, chúng tôi kết hợp điều đó với câu lệnh SQL của mình và làm bùng nổ đối số:

sqlstr := fmt.Sprintf(`SELECT *
  FROM foo
  WHERE type = ?
    AND subtype IN (%s)`, inCodition)
rows, err := sqldb.Query(sqlstr, params...)

Tất nhiên, sẽ khá tuyệt, nếu bạn chỉ cần vượt qua []slice s cho các câu lệnh đã chuẩn bị của bạn và được tự động mở rộng. Nhưng điều đó có thể mang lại một số kết quả không mong muốn nếu bạn đang xử lý nhiều dữ liệu 'không xác định' hơn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Loại bỏ hoàn toàn MySQL Ubuntu 14.04 LTS

  2. Chia sẻ cơ sở dữ liệu (mysql) giữa các ứng dụng Django với các bộ định tuyến Cơ sở dữ liệu

  3. nhiều bảng SQL với PHP để tạo sơ đồ trang web

  4. Làm cách nào để xuất kết quả khớp sau khi so sánh hai bảng?

  5. MySQL - Toán tử GIỮA với FLOAT (10,6) hoạt động giống như> và <, thay vì> =và <=