我有一个带有属性的表测试,该属性是字符串数组的数组。
例如数组“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功能呢?
答案 0 :(得分:2)
没有任何SPI函数可以返回有关数组的信息。 SPI函数通常是类型不可知 - SPI函数列表http://www.postgresql.org/docs/current/static/spi.html
您应该使用SPI_getbinval - 它返回二进制(Datum)值
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}'; ?column? ---------- t (1 row)
SQL级别的处理通常比使用DirectFunctionCall API简单得多。