2016-03-20 3 views
1

Попытка выполнить фрагмент SQL:Ecto SQL Fragment терпит неудачу, почему?

Repo.all from p in Posts, where: fragment("lower(?) in ?", p.title, ^["some-title"]) 

Но это не удается, он генерирует следующий SQL и ошибки:

SELECT p0."title" FROM "posts" AS p0 WHERE (lower(p0."title") in $1) [["some-title"]] 

** (Postgrex.Error) ERROR (syntax_error): syntax error at or near "$1" 

UPDATE: РЕШЕНИЕ

Таким образом, после многих испытаний я выяснили, как им пользоваться:

Repo.all from p in Posts, where: fragment("lower(?)", p.title) in ^["some-title"]) 

Но все же - Почему оригинальное выражение не сработало? Похоже, что это тоже вполне реально.

UPDATE

There should be parentheses after in

Я пробовал, не работает либо:

Repo.all from p in Posts, where: fragment("lower(?) in (?)", p.title, ^["some-title"]) 

** (ArgumentError) Postgrex expected a binary that can be encoded/cast to type "text", got ["some-title"]. Please make sure the value you are passing matches the definition in your table or in your query or convert the value accordingly. 
+1

Там должны быть круглые скобки после 'в'. –

ответ

2

1) Да, правильный путь является:

Repo.all from p in Posts, where: fragment("lower(?)", p.title) in ["some-title"]) 

2) Исходный запрос не работает, потому что он генерирует неправильный синтаксис SQL. Это создает что-то вроде:

... where lower(p.title) in ["some-title"] ... 

где правый синтаксис:

... where lower(p.title) in ('some-title') ... 
Смежные вопросы