我有一个表,里面有一些 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/