PostgreSQL相当于MySQL查询变量?


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-
埃文·卡罗尔

Answers:


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'1

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 。

WITHPostgreSQL中的CTE(查询),窗口函数等可满足MySQL中查询变量的大多数使用。


好吧,实际上有,但是它们不适合在查询中一般使用。通常,您可以使用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而不是in psql)来实现。


需要更新。因为最新的Postgresql允许:SET LOCAL variable value
Eugen Konkov

1
这些是用于配置参数的-这与@EugenKonkov完全不同
Evan Carroll

1

对于第二个示例,您不需要变量(在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%');
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.