如何检测current_setting是否为null

时间:2015-11-02 22:35:02

标签: sql postgresql plpgsql

我正在编写一个函数,如果当前用户已经“加星标”了一行。当前用户的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。

2 个答案:

答案 0 :(得分:2)

基本上,@ 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;
  • 避免使用符合表格的列和/或使用非冲突的参数名称进行命名冲突。我做了两件事。

  • 当参数被重置为CASE(空字符串)时,使用-1语句默认为''或其他任何内容。

  • EXISTS可能比COUNT(*) != 0便宜得多。

  • 我在FROM列表中的一个微小的子选择中检索参数值。简化CASE声明。

答案 1 :(得分:0)

您可以使用此:

select coalesce( nullif(current_setting( 'my.var', true ),'')::timestamptz, now() )

在此示例中,如果未定义'my.var',current_setting将返回空字符串,然后nullif将返回NULL。

coalesce函数将首先返回非null参数,now()在这种情况下