1

我有一个表测试,其属性是字符串数组的数组。

例如数组“ar”是 {{1,A},{A,B,C},{45}}

现在我想检查数组之间是否有值。例如,如果{A,B,C}是数组“ar”的成员。

我在 postgres (postgres.c) 的核心内部工作,所以我使用的是 SPI 函数。

SPI_connect();
SPI_exec("select * from test", 0);
if (SPI_processed > 0){
    char *s=SPI_getvalue(SPI_tuptable->vals[SPI_processed],SPI_tuptable->tupdesc,1);
}

但是 SPI_getvalue 返回一个字符串,我需要该数组来检查该数组是否是主数组“ar”的成员。

是否有任何 SPI 功能可以做到这一点?

4

1 回答 1

2

没有任何 SPI 函数可以返回有关数组的信息。SPI 函数通常与类型无关 - SPI 函数列表http://www.postgresql.org/docs/current/static/spi.html

您应该使用 SPI_getbinval - 它返回一个二进制(基准)值

http://www.postgresql.org/docs/current/static/spi-spi-getbinval.html

接下来,您可以分析一个 postgresql/src/backend/utils/adt/array*.c 文件,如果有一些有用的功能对您有帮助。有一个静态的array_contain_compare,主要是arrayoverlap、arraycontains和arraycontained。您可以通过 DirectFunctionCall API 调用这些函数 - 请参阅这个很好的 Greg 教程http://www.pgcon.org/2010/schedule/attachments/142_HackingWithUDFs.pdf或者您可以在 SQL 级别执行此操作,然后结果将是一个布尔值 - http://www.postgresql.org/docs/current/static/functions-array.html

postgres=# select '{{1,A, 1},{A,B,C},{45,46,47}}'::text[] @> '{A,B,C}';
 ?柱子?
----------
 吨
(1 行)

SQL 级别的处理通常比使用 DirectFunctionCall API 简单得多。

于 2013-08-02T15:39:07.873 回答