考虑这个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
答案 0 :(得分:4)
匿名代码块(DO
command)无法返回行,Postgres没有全局变量。
没有它,生活的方式很少。其中四个如下。
使用公用表表达式(WITH
command)
Array(
((1001-150329-002-0-04624,5060567),0),
((1002-141105-008-0-01934,10145500),0),
((1013-150324-009-0-02270,15750046),0),
((1005-150814-005-0-05885,5060656),1)),
((1009-150318-004-0-02537,5060583),0))
为变量使用临时表:
WITH def AS (
SELECT 3 AS colorid
)
SELECT *, substring(name,1,3)
FROM products
JOIN def
USING (colorid);
使用临时表获取结果:
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;