добавление массива в качестве параметра к SQL-запросу в ruby - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть массив

ziparray = ["95626", "95645", "95837"]

Я хочу передать это в мой запрос sql,

sql = "SELECT * from table_name WHERE code in ($1);"
res1 = conn.exec(sql, [ziparray])

Он работает для отдельных значений.

Яиспользование pg gem и подключение к базе данных с использованием

conn = PG.connect()

Я использую postgres, и он не принимает двойные кавычки.Я предполагаю, что это будет проблемой.Как этого добиться.

Обновление

Я мог бы конвертировать в нужную строку, используя

str = "'"
str << ziparray.join("','")
str << "'"
#print str

Но я думаю, что проблема заключается в передаче нескольких параметров.

это работает -

res1 = conn.exec(fipscodesql, ['95626'])

Но не это

res1 = conn.exec(fipscodesql, ['95626', '95625'])

, и это именно то, что я сделал, когда преобразовал массив в строку.Я думаю, что это не правильный способ использования параметров.Есть ли другой способ.

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Как уже говорили другие, вы не можете параметризовать целый массив.Используйте это вместо:

ziparray = ["95626", "95645", "95837"]
zip_placeholders = ziparray.map.with_index(1) { |_, i| "$#{i}" }.join(', ')
sql = "SELECT * from table_name WHERE code in (#{zip_placeholders});"
# => "SELECT * from table_name WHERE code in ($1, $2, $3)"

Тогда вы можете использовать обычную привязку параметров.

0 голосов
/ 20 ноября 2018

Если x является массивом и x = ['a','b','c']

quotes = (select * from quote in (?), x)
  • Мы не можем использовать это в параметре SQL
  • x.join(',') возвращает "a,b,c".Если это int, это не проблема.
  • Вместо этого сохраните этот массив в переменной и используйте его в параметре SQL.

a = x и затем используйте quotes = (select * from quote in (?),a)

0 голосов
/ 27 сентября 2018

Метод SQL "IN" не использует массив.
Итак:

IN(234) - correct 
IN(234,543) - correct
IN([234,543]) - wrong

Вы можете попытаться преобразовать массив в строку и передать переменную $ 1, например '95626, 95645, 95837'

...