sql - 如何检测 current_setting 是否为空

标签 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。

最佳答案

基本上,@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 语句。

关于sql - 如何检测 current_setting 是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33488282/

相关文章:

sql - 如果匹配已存在,我如何将行号附加到行插入?

mysql - 按选项过滤产品

c# - Visual Studio 2013 连接到 SQL Server 2014

java - JPA - 将对象级联保存到由 id 映射的数据库

java - 为 Heroku 应用程序的本地版本配置数据库访问

mysql - 在 MySQL 更新语句中使用 Concat 之前检查字段内容

postgresql - 从 Postgres 中提取 XML 元素值

postgresql - SELECT .. INTO 在 PL/pgSQL 中创建表

postgresql - 检查 plpgsql 中的当前日志记录级别

database - 多态函数的 SQL 注入(inject)安全调用