如何通过带有 Ruby Sequel 的占位符将列表传递给 IN 子句

How to pass a list to an IN clause via a placeholder with Ruby Sequel

我正在尝试将引用列表传递给带有 Ruby Sequel.

IN 子句中的占位符

具体来说:

query = "
SELECT *
FROM PRICE
WHERE REGION IN (?)"

然后我用RubySequel:dataset = dbr[query, param_values]; dataset.sql。 如果我像这样将 param_values 作为字符串传递:param_values = "'NSW1', 'VIC1'",where 子句变为: WHERE REGION IN ((N'''NSW1'', ''VIC1''')) 不起作用 - 大概引号太多了。如果我尝试将参数作为带引号的字符串数组传递,如下所示:param_values = %w[NSW1 VIC1] where 子句变为:WHERE REGION IN ((N'NSW1' = N'VIC1')) 不起作用。

有什么有用的东西吗?

我会使用 Sequel's query builder language 而不是手动编写 SQL 如果您使用默认命名约定,它看起来像这样:

DB[:prices]
  .select(:date, :price, :region_id)
  .where(region_id: %w[NSW1 VIC1])
query = "
SELECT *
FROM PRICE
WHERE REGION IN ?"
regions = Sequel.lit("'NSW1', 'VIC1'")
sql = db.fetch(query, regions).sql
puts "sql: #{sql}"

给出:

sql: SELECT *
FROM PRICE
WHERE REGION IN ('NSW1', 'VIC1')

这就是我们想要的。