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

Hvordan disambigueres et plpgsql-variabelnavn i en ON CONFLICT-klausul?

til at starte med name er et dårligt navn for både variabel og attribut. Når du har begge dele, ser koden ikke godt ud. med det i tankerne kan du "præfikse" variabel med mærket blok (i eksemplet nedenfor <<fn>>``), and set variabel_konflikt` for at give præference til kolonnenavn, se koden nedenfor:

t=# create or replace function func(
    name text
) returns void language plpgsql as
$$
#variable_conflict use_column
<<fn>>
declare name text :='blah';
begin
    insert into test (name) values (name)
    on conflict (name) do            -- this no longer fails
    update set name = fn.name;
end;
$$;
t=# insert into test select 'b';
INSERT 0 1
Time: 8.076 ms
t=# select func('b');
 func
------

(1 row)

Time: 6.117 ms
t=# select * from test;
 name
------
 b
 blah
(2 rows)

https://www.postgresql.org /docs/current/static/plpgsql-implementation.html#PLPGSQL-VAR-SUBST

og yderligere - dybest set handler hele linket om det.

Og alligevel - efter at have demonstreret, hvordan en bestemt opgave dette nemt kan udføres med plpgsql, citerer jeg stadig namual:



  1. Sådan opretter du en grupperet rapport ved hjælp af rapportguiden i Access 2016

  2. CURRENT_TIME Eksempler – MySQL

  3. Forespørgsel efter nøjagtig match af en streng i SQL

  4. Opgraderet til Ubuntu 16.04 nu er MySQL-python-afhængigheder brudt