web-dev-qa-db-ja.com

MySQLクエリ変数に相当するPostgreSQLですか?

これらのタイプのMySQLクエリをPostgreSQLに適応させる簡単な方法はありますか?

  1. mySQLのように変数を設定する

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

    そうではないようです

  2. SELECTクエリから変数を割り当て、それらの変数を後で私のSQLで使用する:

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

特に(2)については、ポインタに非常に感謝します。

8
Daniel

これはPL/pgSQL関数(または [〜#〜] do [〜#〜] ブロック)内で簡単に実行できます:

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 $$;

[〜#〜] guc [〜#〜] 変数を使用することもできます:

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

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

または、結合でCTEを使用できます。

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
12
Neil McGuigan

WITHステートメントを使用します。

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

そして:

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

あなたはすでにあなた自身でこれに答えました:いいえ、プレーンSQLにはありません。関数またはDOブロックで変数が必要な場合は、PL/PgSQLを使用できます。

MySQLでのクエリ変数の使用のほとんどは、PostgreSQLのCTE(WITHクエリ)、ウィンドウ関数などによって満たされます。


まあ、実際にはありますが、クエリ内での一般的な使用には適していません。通常、SETおよびSHOWを使用してカスタムGUCにアクセスしますが、代わりに以下を使用することもできます。

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

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

GUCは高価であり、これを汎用クエリに使用することは悪い考えですが、有効な使用法は非常にまれです。 myapp.variableのような設定も使用できます。

3
Craig Ringer

PSQL変数

少なくともバージョン7.1以降、PostgreSQLのクライアントは psql variables を使用してこの機能を提供しています

\set aintconst  -333
\set arealconst -9.999

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

基本的に必要なのは、SQLをスクリプト化する機能です。 PSQLには条件と変数があり、動的に生成されたSQLをフィードバックできるため、この作業が簡単になります。これはPostgreSQLの世界ではサーバー側の機能ではありません。通常、これはクライアント言語(psqlではなくNode.jsやPerlなど)で行います。

2
Evan Carroll

2番目の例では、変数は必要ありません(MySQLでもPostgresでも):

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

サブクエリを恐れないでください。PostgresのクエリオプティマイザはMySQLのクエリオプティマイザよりもはるかに優れています。

上記の処理が遅すぎる場合は、existsクエリに書き直す方が速い場合があります。

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