Function postgresql中作为过滤器的类宏函数

Function postgresql中作为过滤器的类宏函数,function,postgresql,database,stored-functions,Function,Postgresql,Database,Stored Functions,我有一个表,里面有一些RDF语句,比如Quadsgraph、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('sm

我有一个表,里面有一些RDF语句,比如Quadsgraph、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实例:

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

后者[功能]似乎不适合组合,例如 不能做一个假设

select * from quads where type('smtg:Type') and inGraph('mygraph')
只要返回类型是稳定的,就可以在plpgsql函数中执行几乎任何操作

您没有透露如何解析类型“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或更高版本中,您还可以使用参数名,而不是位置参数$1、$2、。。在SQL函数中

电话:

因为我为第二个参数定义了默认值,所以您可以使用一个或两个参数调用此函数:

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


我不明白为什么不能在PL/pgSQL函数中实现这一点。但可以肯定的是,我们需要更多的信息。请将确切的表格结构发布为创建表格。。。和一些样本数据作为插入到。。。如果谓词在功能上依赖于object,则可以在发布前两条语句的工作副本,然后应该删除冗余列并规范化模式。动词的附加条件在宾语的附加条件旁边是多余的。若动词不能从宾语中推导出来,那个么还不清楚如何解析“Person”类型。通常,您几乎可以在plpgsql中执行任何操作。当遇到普通SQL无法解决的问题时,请在plpgsql函数中生成动态SQL。在此搜索[plpgsql]执行或动态sql,以便了解更多信息。动词在功能上不依赖于对象。我不明白你所说的“解决”是什么意思,很抱歉,但是,type'Person'将等同于动词_,而_object_等同于'type','Person'并固定了一个参数。感谢你的回答,我更新了这个问题,更详细地说明了参数/返回值是什么。正如我所写的,一个集合/表格返回函数似乎是不可组合的,我基本上必须预先编写其中所有可能的谓词组合。