PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

JavaScript (Postgres DB) - Jak używać przygotowanej instrukcji z tablicą jako parametrem w klauzuli WHERE IN ( )

Jest to opisane w często zadawanych pytaniach o node-postgres https://github.com/brianc/node-postgres/wiki/FAQ#11-jak- zrób-i-buduj-gdzie-foo-w-zapytanie, aby znaleźć-wiersze-dopasowane-do-tablicy-wartości

Jak zbudować zapytanie WHERE foo IN (...), aby znaleźć wiersze pasujące do tablicy wartości? node-postgres obsługuje mapowanie prostych tablic JavaScript na tablice PostgreSQL, więc w większości przypadków możesz po prostu przekazać je jak każdy inny parametr.

client.query("SELECT * FROM stooges WHERE name = ANY ($1)", [ ['larry', 'curly', 'moe'] ], ...);

Zauważ, że =DOWOLNY to inny sposób na napisanie IN (...), ale w przeciwieństwie do IN (...) będzie działał tak, jak oczekiwałeś, gdy przekażesz tablicę jako parametr zapytania.

Jeśli znasz wcześniej długość tablicy, możesz ją spłaszczyć do listy IN:

// passing a flat array of values will work:
client.query("SELECT * FROM stooges WHERE name IN ($1, $2, $3)", ['larry', 'curly', 'moe'], ...);

... ale jest niewielka korzyść, gdy =ANY działa z tablicą JavaScript.

Jeśli korzystasz ze starej wersji node-postgres lub potrzebujesz stworzyć bardziej złożone tablice PostgreSQL (tablice typów złożonych itp.), z którymi node-postgres nie radzi sobie, możesz wygenerować literał tablicy za pomocą dynamicznego SQL, ale bądź bardzo ostrożny podczas wstrzykiwania SQL. Poniższe podejście jest bezpieczne, ponieważ generuje ciąg zapytania z parametrami zapytania i spłaszczoną listą parametrów, więc nadal korzystasz ze wsparcia sterownika dla zapytań parametrycznych („przygotowane instrukcje”) w celu ochrony przed wstrzyknięciem SQL:

var stooge_names = ['larry', 'curly', 'moe'];
var offset = 1;
var placeholders = stooge_names.map(function(name,i) { 
    return '$'+(i+offset); 
}).join(',');
client.query("SELECT * FROM stooges WHERE name IN ("+placeholders+")", stooge_names, ...);

Mam nadzieję, że to pomoże, ponieważ Google nie może tego znaleźć




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak ustawić strefę czasową dla Postgres 9.4 na stałe?

  2. Zapytanie SQL, aby wybrać pary wartości w kolumnie 1, które pasują do jednego z dwóch wzorców w kolumnie 2

  3. Opóźnienie lub oczekiwanie na wyciąg

  4. Przesyłanie strumieniowe danych z Postgresa do Pythona

  5. eclipselink jpa generuje zapytania licznikowe używając COUNT(id) zamiast COUNT(*)