2016-03-20 7 views
1

Der Versuch, SQL-Fragment auszuführen:Ecto SQL-Fragment schlägt fehl, warum?

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

Aber es fehlschlägt, erzeugt es folgende SQL und den Fehler:

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

ich also nach vielen Studien herausgefunden, wie man es benutzt:

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

Aber immer noch - warum der ursprüngliche Ausdruck nicht funktioniert hat? Es scheint, dass es auch absolut gültig ist.

UPDATE

There should be parentheses after in

ich es versucht, funktioniert hat auch nicht:

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

Es sollte Klammern nach 'in' sein. –

Antwort

2

1) Ja, der richtige Weg zu gehen ist:

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

2) Die ursprüngliche Abfrage funktioniert nicht, weil sie falsche SQL-Syntax erzeugt. Es erzeugt so etwas wie:

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

wo die richtige Syntax:

... where lower(p.title) in ('some-title') ...