sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan man vælger fra variabel, der er et tabelnavn n Postgre>=9.2

Korrekt svar er en kommentar fra Anton Kovalenko

Du kan aldrig bruge variabel som tabel- eller kolonnenavn i indlejret SQL.

UPDATE dynamic_table_name SET ....

PostgreSQL bruger en forberedt og gemt planer for indlejret SQL, og referencer til et målobjekter (tabeller) er dybt og hårdt kodet i planer - nogle karakteristika har betydelig indflydelse på planer - for en tabel kan bruges indeks, for andre ikke. Forespørgselsplanlægning er relativt langsom, så PostgreSQL prøver det ikke gennemsigtigt (uden få undtagelser).

Du bør bruge en dynamisk SQL - et enkelt formål er at bruge til lignende situationer. Du genererer altid en ny SQL-streng, og planer gemmes ikke

DO $$
DECLARE r record;
BEGIN
  FOR r IN SELECT table_name 
              FROM information_schema.tables
             WHERE table_catalog = 'public'
  LOOP
    EXECUTE format('UPDATE %I SET id = 10 WHERE id = 15', r.table_name);
  END LOOP;
END $$;

Bemærk:Dynamisk SQL er usikker (der er en SQL-injektion risici) uden parametersanering. Jeg brugte en funktion "format " for det. En anden måde er at bruge "quote_ident " funktion.

EXECUTE 'UPDATE ' || quote_ident(r.table_name) || 'SET ...



  1. ActiveModel::MissingAttributeError:kan ikke skrive ukendt attribut `user_id`

  2. Forespørg databaseværdier baseret på brugerens placering

  3. hvordan man får værdi i array fra individuel forespørgsel

  4. MySql, opdel en streng og indsæt i tabellen