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


9

これらのタイプの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)については、ポインタに非常に感謝します。


PSQL変数があなたが探しているものであることがわかるかもしれません。dba.stackexchange.com/a/213009/2639
エヴァンキャロル

回答:


13

これは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

GUCメソッドを使用する場合、数値の列挙リストを使用して変数をどのように設定しますか?
user952342

9

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)

3

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

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


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

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も使用できます。


2

PSQL変数

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

\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の世界ではサーバー側の機能ではありません。通常、これはクライアント言語で行います(Node.jsやPerlなどではなくpsql)。


更新が必要です。最新のPostgresqlが許可するため:SET LOCAL variable value
Eugen Konkov '13

1
これらは構成パラメーター用です-それはまったく異なります@EugenKonkov
Evan Carroll

1

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%');
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.