function - 类似宏的函数作为 postgresql 中的过滤器

标签 function postgresql database stored-functions

我有一个表,里面有一些 RDF 语句,比如 Quads(graph, subject, verb, object) 我发现自己在做这样的查询:

select * from quads where verb = 'rdf:type' and object = 'smtg:Type'
select * from quads where verb = 'rdf:label' and object = 'bla bla'

我想用这样的形式来表达

select * from quads where type('smtg:Type')
select * from quads where label('bla bla')

虽然这看起来是一个“微不足道的”文本替换,但我不知道如何以及是否可以在 postgresql 中实现它,尽管我认为这是不可能的。

据我所知,我可以使用函数对常量进行硬编码,然后执行

select * from quads where rdftype() = verb and object = 'smtg:Type'

或者我可以使用函数作为 from 参数,例如

select * from typed('smtg:Type')

可悲的是,前者相当冗长,而后者似乎无法修改组合,例如我不能做假设

select * from quads where type('smtg:Type') and inGraph('mygraph')

有没有办法做我想做的事?似乎不可能,但我想知道有没有办法。

编辑:一个sqlfiddle实例:http://sqlfiddle.com/#!1/40b2c/3 .

更清楚地说,这似乎不可行的原因是宏函数将返回一个 bool 值(它用在 where 子句中,就好像它在哪里 select $1=somevalue) 但使用“隐式”行参数,它可以一次访问多个字段,我还没有在 pg 文档中看到这样的示例。

最佳答案

and the latter [function] does not seem to be amendable to combination e.g. I can't do an hypothetical

只要返回类型稳定,您几乎可以在 plpgsql 函数中执行任何操作。

您没有透露如何解析 type('smtg:Type')inGraph('mygraph') - 这些应该是函数吗?返回..什么?
但是对于像这样的简单情况,即使是普通的 SQL 函数也应该可以完成这项工作:

CREATE OR REPLACE FUNCTION f_foo (_type text, _graph text DEFAULT NULL)
  RETURNS SETOF quads AS
$func$
   SELECT *
   FROM   quads
   WHERE  CASE WHEN $1 IS NOT NULL THEN ... ELSE ... END
   AND    CASE WHEN $2 IS NOT NULL THEN ... ELSE ... END
   ORDER  BY ...;
$func$  LANGUAGE sql;

在 PostgreSQL 9.2 或更高版本中,您还可以在 SQL 函数中使用参数名称而不是位置参数($1$2、..)。

调用:

由于我为第二个参数定义了一个 DEFAULT,您可以使用一个两个参数调用此函数:

SELECT * FROM f_foo('smtg:Type');

或者:

SELECT * FROM f_foo('smtg:Type', 'mygraph');

关于function - 类似宏的函数作为 postgresql 中的过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13670144/

相关文章:

sql - SQL中的getAge取决于两个日期

php - 如果嵌套数组为空,则删除 mongo 数组

javascript - 有没有办法在 JavaScript 的函数调用中提供命名参数?

javascript - document.getElementById.show() 不是函数

database - pgAdmin 4 - 查询工具自动完成的性能很差,这正常吗?

mysql - MYSQL 中的 UPDATE/INSERT INTO/DELETE FROM 表

mysql - MySQL 调查设计中的可重用问题

JavaScript 面向对象编程 : Passing a value to property through input fails

java - 使用对象和重复列表时 Java 列表中的 ConcurrentModificationException

sql - sql中多对多关系的外键