PostgreSQL 相当于 MySQL 查询变量?

Dan*_*iel 11 mysql postgresql

是否有一种直接的方法可以将这些类型的 MySQL 查询调整到 PostgreSQL:

  1. 在 MySQL 中设置变量,例如

    set @aintconst = -333
    set @arealconst = -9.999
    
    Run Code Online (Sandbox Code Playgroud)

    似乎不是

  2. 从 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)


Cra*_*ger 5

您已经自己回答了这个问题:不,在普通 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


Eva*_*oll 5

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)
Run Code Online (Sandbox Code Playgroud)

本质上,您想要的是编写 SQL 脚本的能力。PSQL 具有条件和变量,并且能够反馈动态生成的 SQL,这使得这项工作更容易。这不是 PostgreSQL 世界中的服务器端功能,通常我会使用客户端语言(如 Node.js 或 Perl 而不是 in psql)来执行此操作。

  • 那些用于配置参数——这是完全不同的事情@EugenKonkov (2认同)