PostgreSQL-Äquivalent zu MySQL-Abfragevariablen?

9

Gibt es eine einfache Möglichkeit, diese Arten von MySQL-Abfragen an PostgreSQL anzupassen:

  1. Variablen in MySQL einstellen wie

    set @aintconst = -333
    set @arealconst = -9.999
    

    Es scheint nicht .

  2. Zuweisen von Variablen aus SELECT-Abfragen und anschließende Verwendung dieser Variablen in meinem SQL wie folgt:

     select @pfID := id from platform where bios like '%INTEL%'
     select @clientID := id from client where platformID = @pfID
    

Ich wäre sehr dankbar für Hinweise, insbesondere auf (2).

Daniel
quelle
Möglicherweise suchen Sie nach PSQL-Variablen. dba.stackexchange.com/a/213009/2639
Evan Carroll

Antworten:

13

Dies ist in einer PL / pgSQL-Funktion (oder einem DO- Block) einfach zu bewerkstelligen :

create function myfunc() returns void language plpgsql as $$
  declare
    aintconst constant int = -333;
    arealconst constant real = -9.99;
    pfid int;
    clientid int;
  begin

    select id from platform where bios like '%INTEL%' into pfid;

    select id from client where platformID = pfid into clientid;

  end $$;

Sie können auch GUC- Variablen verwenden:

--set a session variable
set mycustom.var = 'value';

--use it
select * from mytable where some_column = current_setting('mycustom.var');

Oder Sie können einen CTE mit einem Join verwenden:

with myvars as (
  select
    -333::int as aint,
    -9.99::real as areal
)

select 
  a.*
from mytable a
join myvars on true
where
  a.thing = aint
Neil McGuigan
quelle
Wie richten Sie bei Verwendung der GUC-Methode eine Variable mit einer aufgezählten Liste von Zahlen ein?
user952342
9

Ich benutze WITH-Anweisungen:

WITH vars as (SELECT -333::double precision as aintconst,-9.999::double precision as arealconst)
UPDATE table SET col1 = (SELECT aintconst FROM vars)

und:

WITH platformx AS (SELECT id FROM platform WHERE bios like '%INTEL%')
SELECT id FROM client WHERE platformID = (SELECT id FROM platformx)
user2641043
quelle
3

Sie haben dies bereits selbst beantwortet: Nein, es gibt kein einfaches SQL. Sie können PL / PgSQL verwenden, wenn Sie Variablen, eine Funktion oder einen DOBlock möchten .

Die meisten Verwendungen für Abfragevariablen in MySQL werden von CTEs ( WITHAbfragen), Fensterfunktionen usw. in PostgreSQL erfüllt .


Nun, eigentlich gibt es das, aber sie sind nicht für den allgemeinen Gebrauch in Abfragen geeignet. Normalerweise greifen Sie mit SETund auf benutzerdefinierte GUCs zu SHOW, können aber stattdessen Folgendes verwenden:

regress=> select set_config('a.b', 'c', false);
 set_config 
------------
 c
(1 row)

regress=> select current_setting('a.b');
 current_setting 
-----------------
 c
(1 row)

GUCs sind teuer und es ist eine schlechte Idee, sie für allgemeine Abfragen zu verwenden, aber es gibt gelegentlich eine gültige Verwendung. Sie können auch nur Einstellungen wie verwenden myapp.variable.

Craig Ringer
quelle
2

PSQL-Variablen

Seit mindestens Version 7.1 hat der PostgreSQL-Client diese Funktionalität mit psqlVariablen versehen

\set aintconst  -333
\set arealconst -9.999

SELECT :aintconst AS aintconst, :arealconst AS realconst;
 aintconst | realconst 
-----------+-----------
      -333 |    -9.999
(1 row)

Im Wesentlichen möchten Sie die Fähigkeit, SQL-Skripte zu erstellen. PSQL verfügt über Bedingungen und Variablen sowie die Möglichkeit, dynamisch generiertes SQL zurückzugeben, was diese Aufgabe erleichtert. Dies ist keine serverseitige Funktionalität in der PostgreSQL-Welt, und im Allgemeinen würde ich dies in einer Client-Sprache tun (wie Node.js oder Perl anstatt in psql).

Evan Carroll
quelle
brauche Updates. weil spätestens Postgresql erlauben:SET LOCAL variable value
Eugen Konkov
1
Diese sind für Konfigurationsparameter - das ist eine ganz andere Sache @EugenKonkov
Evan Carroll
1

Für das zweite Beispiel benötigen Sie keine Variable (weder in MySQL noch in Postgres):

select id 
from client 
where platformID in (select id 
                     from platform 
                     where bios like '%INTEL%');

Haben Sie keine Angst vor Unterabfragen. Der Abfrageoptimierer von Postgres ist viel intelligenter als der von MySQL.

Wenn das oben Gesagte zu langsam ist, ist das Umschreiben in eine existsAbfrage manchmal schneller:

select c.id 
from client c
where exists  (select 1
               from platform p
               where c.platformID = p.id
                 and bios like '%INTEL%');
ein Pferd ohne Name
quelle