如何检测 current_setting 是否为空
How to detect if current_setting is null
我正在编写一个函数,用于获取当前用户是否已“加星标”一行。当前用户的 id 存储在一个局部变量中,可以通过 postgresql current_setting
函数访问。如何为 current_setting
提供默认值?这是我的功能:
CREATE FUNCTION current_user_starred(star_group_id integer)
RETURNS boolean
AS $$
SELECT COUNT(*) != 0
FROM star
WHERE star_group_id = star_group_id
AND starrer_id = current_setting('user_id')::integer;
$$
LANGUAGE sql;
对于默认设置,我想对 current_setting('user_id')
使用 -1 或 0。
基本上,@Craig 的评论是:为角色或数据库设置 customized option:
ALTER ROLE SET foo.user_id = '-1';
或:
ALTER DATABASE SET foo.user_id = '-1';
或将设置添加到 postgresql.conf
(对于整个数据库集群)并重新加载。
否则如果参数还没有设置,你可以触发异常:
ERROR: unrecognized configuration parameter "foo.user_id"
SQL state: 42704
你还需要一个工作函数。你提供的东西坏了。
CREATE FUNCTION current_user_starred(_star_group_id integer)
RETURNS boolean AS
$func$
SELECT EXISTS (
SELECT 1
FROM star s, (SELECT current_setting('foo.user_id') AS _user_id) x
WHERE s.star_group_id = _star_group_id
AND s.starrer_id = CASE x._user_id WHEN '' THEN -1 ELSE x._user_id::integer END
);
$func$ LANGUAGE sql;
通过 table 限定列和/或使用不冲突的参数名称避免命名冲突。我都做了。
使用 CASE
语句默认为 -1
或当参数已重置为 ''
(空字符串)时的任何内容。
EXISTS
可以比 COUNT(*) != 0
便宜很多。
我在 FROM
列表中的一个小子选择中检索参数值。简化 CASE
语句。
你可以使用这个:
select coalesce( nullif(current_setting( 'my.var', true ),'')::timestamptz, now() )
在此示例中,如果未定义 'my.var',current_setting
将 return 为空字符串,然后 nullif
将 return NULL。
coalesce
函数将 return 第一个非空参数,now()
在这种情况下
我正在编写一个函数,用于获取当前用户是否已“加星标”一行。当前用户的 id 存储在一个局部变量中,可以通过 postgresql current_setting
函数访问。如何为 current_setting
提供默认值?这是我的功能:
CREATE FUNCTION current_user_starred(star_group_id integer)
RETURNS boolean
AS $$
SELECT COUNT(*) != 0
FROM star
WHERE star_group_id = star_group_id
AND starrer_id = current_setting('user_id')::integer;
$$
LANGUAGE sql;
对于默认设置,我想对 current_setting('user_id')
使用 -1 或 0。
基本上,@Craig 的评论是:为角色或数据库设置 customized option:
ALTER ROLE SET foo.user_id = '-1';
或:
ALTER DATABASE SET foo.user_id = '-1';
或将设置添加到 postgresql.conf
(对于整个数据库集群)并重新加载。
否则如果参数还没有设置,你可以触发异常:
ERROR: unrecognized configuration parameter "foo.user_id" SQL state: 42704
你还需要一个工作函数。你提供的东西坏了。
CREATE FUNCTION current_user_starred(_star_group_id integer)
RETURNS boolean AS
$func$
SELECT EXISTS (
SELECT 1
FROM star s, (SELECT current_setting('foo.user_id') AS _user_id) x
WHERE s.star_group_id = _star_group_id
AND s.starrer_id = CASE x._user_id WHEN '' THEN -1 ELSE x._user_id::integer END
);
$func$ LANGUAGE sql;
通过 table 限定列和/或使用不冲突的参数名称避免命名冲突。我都做了。
使用
CASE
语句默认为-1
或当参数已重置为''
(空字符串)时的任何内容。EXISTS
可以比COUNT(*) != 0
便宜很多。我在
FROM
列表中的一个小子选择中检索参数值。简化CASE
语句。
你可以使用这个:
select coalesce( nullif(current_setting( 'my.var', true ),'')::timestamptz, now() )
在此示例中,如果未定义 'my.var',current_setting
将 return 为空字符串,然后 nullif
将 return NULL。
coalesce
函数将 return 第一个非空参数,now()
在这种情况下