これらのタイプのMySQLクエリをPostgreSQLに適応させる簡単な方法はありますか?
mySQLのように変数を設定する
set @aintconst = -333
set @arealconst = -9.999
SELECTクエリから変数を割り当て、それらの変数を後で私のSQLで使用する:
select @pfID := id from platform where bios like '%INTEL%'
select @clientID := id from client where platformID = @pfID
特に(2)については、ポインタに非常に感謝します。
これは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
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)
あなたはすでにあなた自身でこれに答えました:いいえ、プレーン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
のような設定も使用できます。
少なくともバージョン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番目の例では、変数は必要ありません(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%');