gpt4 book ai didi

postgresql - SQL 函数 - 将日期参数设置为具有空默认值会中断该函数

转载 作者:行者123 更新时间:2023-11-29 13:26:54 26 4
gpt4 key购买 nike

我有一个函数:

CREATE OR REPLACE FUNCTION eventidswithinradius(
lat double precision,
lng double precision,
radius double precision DEFAULT 10000.0)
RETURNS SETOF bigint AS
$BODY$
SELECT event.event_id
FROM event
JOIN location l USING (location_id)
WHERE earth_box(ll_to_earth(lat, lng),
CASE WHEN radius > 100000.0 OR radius < 1 THEN 10000.0 ELSE radius END
) @> ll_to_earth(l.latitude, l.longitude);
$BODY$
LANGUAGE sql VOLATILE STRICT
COST 100
ROWS 1000;

我想用事件 start_dateend_date 这两个可选参数扩展它,它们的默认参数值为 NULL。所以我写了这个:

CREATE OR REPLACE FUNCTION eventidswithinradius1(
lat double precision,
lng double precision,
radius double precision DEFAULT 10000.0,
e_start_date date DEFAULT NULL,
e_end_date date DEFAULT NULL)
RETURNS SETOF bigint AS
$BODY$
SELECT event.event_id
FROM event
JOIN location l USING (location_id)
WHERE earth_box(ll_to_earth(lat, lng),
CASE WHEN radius > 100000.0 OR radius < 1 THEN 10000.0 ELSE radius END
) @> ll_to_earth(l.latitude, l.longitude);
$BODY$
LANGUAGE sql VOLATILE STRICT
COST 100
ROWS 1000;

注意:我只添加了两个参数,我还没有使用它们。

但是现在当我使用相同的参数运行两个函数时,即:

SELECT * FROM eventidswithinradius(40.1234, 15.2131, 100000.0);
SELECT * FROM eventidswithinradius1(40.1234, 15.2131, 100000.0);

只有第一个返回任何数据。第二个返回一个空表。

我还尝试添加一个测试 varchar 参数,也使用 DEFAULT NULL 而不是两个日期,同样的事情发生了。

谁能告诉我这里发生了什么?我认为 PostgreSQL 不支持多个默认参数,但是检查 documentation我发现 函数可以用一些或所有输入参数的默认值来声明。 所以这应该很清楚。

经过进一步调查,添加不带 DEFAULT 的日期参数有效,所以我假设 NULL 不允许作为默认值?

最佳答案

注意以下事项http://www.postgresql.org/docs/9.4/static/sql-createfunction.html :

CALLED ON NULL INPUT, RETURNS NULL ON NULL INPUT, STRICT

CALLED ON NULL INPUT (the default) indicates that the function will be called normally when some of its arguments are null. It is then the function author's responsibility to check for null values if necessary and respond appropriately.

RETURNS NULL ON NULL INPUT or STRICT indicates that the function always returns null whenever any of its arguments are null. If this parameter is specified, the function is not executed when there are null arguments; instead a null result is assumed automatically.

因此,在您的情况下,将 STRICT 替换为 CALLED ON NULL INPUT 并在函数内部自行执行空值检查。

关于postgresql - SQL 函数 - 将日期参数设置为具有空默认值会中断该函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32156148/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com