是否可以在postgreSQL中使用变量而不指定返回类型?

是否可以在postgreSQL中使用变量而不指定返回类型?,postgresql,plpgsql,Postgresql,Plpgsql,以T-SQL为例: DECLARE @ColorID INT SET @ColorID = 3 SELECT *, left(name,3) FROM Products p WHERE ColorID = @ColorID 这可以工作,但不声明变量: SELECT *, substring(name,1,3) FROM Products p WHERE ColorID = 3 我试过这个: DO $$ DECLARE ColorID INT; BEGIN ColorID :=

以T-SQL为例:

DECLARE @ColorID INT
SET @ColorID = 3

SELECT *, left(name,3) 
FROM Products p
WHERE ColorID = @ColorID
这可以工作,但不声明变量:

SELECT *, substring(name,1,3) 
FROM Products p
WHERE ColorID = 3
我试过这个:

DO $$
DECLARE ColorID INT;
BEGIN
    ColorID := 3;

    SELECT *, substring(name,1,3) 
    FROM Products p
    WHERE ColorID = ColorID 
END$$;
它希望我指定结果集。我不想这样做,因为它一直在变化,因为我只是在探索数据

ERROR:  query has no destination for result data
我尝试了“返回查询”,但出现以下错误:

ERROR:  cannot use RETURN QUERY in a non-SETOF function
因此,我希望返回多行,而不指定结果集的外观。使用PostgreSQL 9.4.4

匿名代码块()无法返回行,并且Postgres没有全局变量。 没有它几乎没有生活的方式。其中四项如下

使用公共表表达式()

为变量使用临时表:

CREATE TEMP TABLE var(colorid int);
INSERT INTO var values (3);
SELECT *, substring(name,1,3) 
FROM products
JOIN var
USING (colorid);
DROP TABLE var;
使用临时表格查看结果:

DO $$
DECLARE v_colorid INT;
BEGIN
    v_colorid := 3;
    CREATE TEMP TABLE res AS 
        SELECT *, substring(name,1,3) 
        FROM products
        WHERE colorid = v_colorid;
END $$;
SELECT * 
FROM res;
DROP TABLE res;
创建函数(示例):


您正在使用哪个SQL客户机?一些客户机提供了SQL.pgAdmin III和Postgres Enterprise Manager v5(仍在研究)之外的变量——我使用了一个临时表来获取结果,这对我来说很有用。
DO $$
DECLARE v_colorid INT;
BEGIN
    v_colorid := 3;
    CREATE TEMP TABLE res AS 
        SELECT *, substring(name,1,3) 
        FROM products
        WHERE colorid = v_colorid;
END $$;
SELECT * 
FROM res;
DROP TABLE res;
CREATE OR REPLACE FUNCTION select_from_products()
RETURNS TABLE (colorid int, name text, abbr text)
LANGUAGE plpgsql as $$
DECLARE v_colorid INT;
BEGIN
    v_colorid := 3;
    RETURN QUERY
        SELECT *, substring(p.name,1,3) 
        FROM products p
        WHERE p.colorid = v_colorid;
END $$;

SELECT * FROM select_from_products();