在PostgreSQL 9.3.4发行说明中它说:
Ensure that the planner sees equivalent VARIADIC and non-VARIADIC function calls as equivalent (Tom Lane)
Run Code Online (Sandbox Code Playgroud)
我搜索了PostgreSQL手册,找不到它的定义.
我发现它与功能参数模式(IN,OUT,VARIADIC)有关,但我不明白这意味着什么?我什么时候想用它?如果函数具有VARIADIC属性,它在性能方面意味着什么?
背景:我们使用 PaperTrail 来保存我们不断变化的模型的历史。现在我想查询属于某个客户的项目。PaperTrail 可选择存储object_changes,我需要查询此字段以了解何时使用此 ID 创建或更改为此 ID。
我的表看起来像这样简化:
item_type | object_changes
----------|----------------------------------------------------------
"Item" | {"customer_id": [null, 5], "other": [null, "change"]}
"Item" | {"customer_id": [4, 5], "other": ["unrelated", "change"]}
"Item" | {"customer_id": [5, 6], "other": ["asht", "asht"]}
Run Code Online (Sandbox Code Playgroud)
如何查询从 ID 5 更改为或更改为 ID 5 的元素(所以上面的所有行)?我试过:
SELECT * FROM versions WHERE object_changes->'customer_id' ? 5;
Run Code Online (Sandbox Code Playgroud)
这让我:
Run Code Online (Sandbox Code Playgroud)ERROR: operator does not exist: jsonb ? integer LINE 1: ...T * FROM versions WHERE object_changes->'customer_id' ? 5; ^ HINT: No operator matches the given name …
postgresql ruby-on-rails paper-trail-gem jsonb postgresql-9.6
这个psql会话片段应该是不言自明的:
psql (9.1.7)
Type "help" for help.
=> CREATE TABLE languages(language VARCHAR NOT NULL);
CREATE TABLE
=> INSERT INTO languages VALUES ('english'),('french'),('turkish');
INSERT 0 3
=> SELECT language, to_tsvector('english', 'hello world') FROM languages;
language| to_tsvector
---------+---------------------
english | 'hello':1 'world':2
french | 'hello':1 'world':2
turkish | 'hello':1 'world':2
(3 rows)
=> SELECT language, to_tsvector(language, 'hello world') FROM languages;
ERROR: function to_tsvector(character varying, unknown) does not exist
LINE 1: select language, to_tsvector(language, 'hello world')...
^
HINT: No function matches the given …Run Code Online (Sandbox Code Playgroud) 我在PostgreSQL 11.2中创建了一个用户定义的函数,如下所示。它基本上将值插入到两个不同的表中:
CREATE OR REPLACE FUNCTION public.insertTest(
IN ID1 integer,
IN Value1 character varying,
IN Value2 character varying,
IN Value3 character varying,
IN Status character varying,
IN Active_Flag integer,
IN Stuff1 smallint,
IN stuff2 smallint)
RETURNS void
LANGUAGE 'plpgsql'
AS $BODY$
BEGIN
Insert into TableA
(TA_ID,
TA_Value1,
TA_Value2,
TA_Value3,
TA_Value4,
TA_Time,
TA_Flag)
values
(ID1,
Value1,
Value2,
Value3,
Status,
now(),
1);
Insert into TableB
(TA_ID,
TB_ID, Confidence, Sev_Rate,
Last_Update_Time, TB_Flag)
values
(currval('tablea_t_id_seq'), --TableA has an auto-increment field
Active_Flag, Stuff1, Stuff2,
now(), …Run Code Online (Sandbox Code Playgroud) postgresql types casting user-defined-functions postgresql-11
这个合法(!)CASE构造返回一个 JSON 数据类型:
SELECT CASE WHEN true THEN to_json(1) ELSE to_json('hello') END;
Run Code Online (Sandbox Code Playgroud)
但:
错误:无法确定多态类型,因为输入的类型为“未知”
它不是“多态”,它是 JSON。
...所以,作为糟糕的解决方法(丢失数字/字符串 JSON 表示),
SELECT to_json(CASE WHEN true THEN 1::text ELSE 'hello' END);
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来执行 SQL 到 JSON 的转换?
PostgreSQL v8.2(Greenplum)
CREATE OR REPLACE FUNCTION util.retrec(OUT p1 date, OUT p2 boolean)
RETURNS RECORD
AS
$BODY$
DECLARE
BEGIN
p1 := current_date;
p2 := true;
RETURN;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
SELECT util.retrec();
Run Code Online (Sandbox Code Playgroud)
这将返回(2016-03-24,t)-我该如何分别提取这两个值?
我可以与之交互进行操作,SELECT p1,p2 FROM util.retrec();但是如何在过程中将两个值分配给两个变量?我尝试了这个:
SELECT util.retrec() INTO r1, r2;
Run Code Online (Sandbox Code Playgroud)
运气不好,这试图将记录分配到r1中。