2015-10-18 22 views
9

Ho una matrice di stringhe e mi piacerebbe avere una query contenente una clausola IN, come:

"... WHERE t.name IN ('foo', 'bar', 'baz')..>" 

Ecco il bit finale della mia interrogazione, che contiene una clausola "dove X in Y":

... 
left join genre_tag_band_join tj on hb.id = tj.band_id or ob.id = tj.band_id 
left join genre_tags t on tj.genre_tag_id = t.id 
inner join venues v on e.venue_id = v.id 

where t.name IN @tagsParam... 

faccio una chiamata Dapper come questo

var shows = con.Query<Event, Band, Band, GenreTag, Venue, Event>(query, (e, hb, ob, gt, v) => 
{ 
    Event show; 
    ... 
    return e; 
}, 
new { tagsParam = tagsArr}).AsQueryable(); 

dove tagsArr è una stringa [].

ottengo un'eccezione:

{ "42601: errore di sintassi nei pressi o in \" $ 1 \ ""}

+0

Supponendo di avere dati non validi che si stanno interrogando qui. – Claies

+0

Scusa, cosa intendi? –

risposta

13

In PostgreSQL, non è possibile utilizzare per controllare se un valore si trova all'interno di un array, è necessario utilizzare la seguente sintassi specifica per PostgreSQL: where t.name = ANY (@tagsParam). Vedere la sezione 8.15.5 in PostgreSQL docs.

+0

Hm, non ho fortuna quando faccio '... e t.name = ANY @ tagsParam'. Penso che postgresql supporti "IN": http://www.postgresqltutorial.com/postgresql-in/. Quando eseguo una query come '... inner join venues v su e.venue_id = v.id dove (e.date> current_date) e t.name in ('foo') ...' in pgadmin, funziona .. –

+3

PostgreSQL supporta IN, ma non con i tipi di array - (1, 2) non è un tipo di array. Con la sintassi ANY, puoi provare a circondare @tagParam con parentesi? –

+0

Bingo! Sei un gentiluomo e uno studioso. –