2016-03-20 20 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:臨床試験の多くの後

のでSOLUTION、I使用方法を理解しました:

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

in' 'の後に括弧があるはず それはのようなものを生成します。 –

答えて

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') ...