Commenti
- Se ci sono davvero 800 clausole where penso che dovresti lavorare sulla tua applicazione
Risposta
Il modo di scrivere questa query è:
SELECT * FROM member_copy WHERE id IN (17579, 17580, 17582);
Tuttavia, la vera domanda è: dove da cui proviene lelenco di id
? Se lelenco di id
è il risultato di unaltra query sul database, dovresti invece eseguire una sottoselezione o un join.
Commenti
- Ha funzionato perfettamente. Non proveniva da una query di database, qualcuno ha effettivamente esaminato e scelto ogni numero. Non li invidio.
Rispondi
Un test con EXPLAIN ANALYZE VERBOSE
ti mostrerà che il modulo con id IN (...)
nella risposta di @ 200_success viene trasformato internamente in:
SELECT * FROM member_copy WHERE id = ANY ("{17579, 17580, 17582}");
.. che quindi è leggermente più veloce allinizio (nessuna conversione necessaria).
Inoltre, il modulo nella tua domanda funzionerà efficacemente molto simile.
Con elenchi grandi, senza test di un array , seguito da un JOIN
sarà generalmente più veloce :
SELECT m.* FROM unnest("{17579, 17580, 17582}"::int[]) id JOIN member_copy m USING (id);
Poiché lelenco è is the result of another database query
, sarà più veloce combinare entrambi in uno query con JOIN
.
Spiegazione più dettagliata:
Risposta
Per un singolo id la seguente query ha funzionato per me:
SELECT * FROM member_copy WHERE id IN ("17579");
Commenti
- Potresti spiegare come questo risponde allOP?