是否有一种直接的方法可以将这些类型的 MySQL 查询调整到 PostgreSQL:
在 MySQL 中设置变量,例如
set @aintconst = -333
set @arealconst = -9.999
Run Code Online (Sandbox Code Playgroud)
似乎不是。
从 SELECT 查询中分配变量并随后在我的 SQL 中使用这些变量,例如:
select @pfID := id from platform where bios like '%INTEL%'
select @clientID := id from client where platformID = @pfID
Run Code Online (Sandbox Code Playgroud)我将非常感谢您的指点,尤其是在 (2) 上。
Nei*_*gan 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 $$;
Run Code Online (Sandbox Code Playgroud)
您还可以使用GUC变量:
--set a session variable
set mycustom.var = 'value';
--use it
select * from mytable where some_column = current_setting('mycustom.var');
Run Code Online (Sandbox Code Playgroud)
或者您可以将 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
Run Code Online (Sandbox Code Playgroud)
小智 11
我使用 WITH 语句:
WITH vars as (SELECT -333::double precision as aintconst,-9.999::double precision as arealconst)
UPDATE table SET col1 = (SELECT aintconst FROM vars)
Run Code Online (Sandbox Code Playgroud)
和:
WITH platformx AS (SELECT id FROM platform WHERE bios like '%INTEL%')
SELECT id FROM client WHERE platformID = (SELECT id FROM platformx)
Run Code Online (Sandbox Code Playgroud)
您已经自己回答了这个问题:不,在普通 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)
Run Code Online (Sandbox Code Playgroud)
GUC 很昂贵,将其用于通用查询是一个坏主意,但偶尔会有效使用。您也只能使用类似的设置myapp.variable。
由于至少 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)
Run Code Online (Sandbox Code Playgroud)
本质上,您想要的是编写 SQL 脚本的能力。PSQL 具有条件和变量,并且能够反馈动态生成的 SQL,这使得这项工作更容易。这不是 PostgreSQL 世界中的服务器端功能,通常我会使用客户端语言(如 Node.js 或 Perl 而不是 in psql)来执行此操作。