我正在尝试选择多个字段,其中一个字段需要是一个数组,该数组的每个元素都包含和两个值。每个数组项都需要包含一个名称(不同的字符)和一个ID(数字)。我知道如何返回单个值的数组(使用ARRAY
关键字),但是我不确定如何返回本身包含两个值的对象的数组。
查询就像
SELECT
t.field1,
t.field2,
ARRAY(--with each element containing two values i.e. {'TheName', 1 })
FROM MyTable t
我读到一种实现此目的的方法是将值选择为一个类型,然后创建该类型的数组。问题是,该函数的其余部分已经返回了一个类型(这意味着我将拥有嵌套的类型-可以吗?如果是这样,您将如何在应用程序代码中读回该数据-即使用.Net数据提供程序(如NPGSQL) ?)
任何帮助深表感谢。
最佳答案
我怀疑如果没有对您的应用程序的更多了解,我将无法一路获得所需的结果。但是我们可以走得很远。对于初学者,有ROW
函数:
# SELECT 'foo', ROW(3, 'Bob');
?column? | row
----------+---------
foo | (3,Bob)
(1 row)
这样一来,您就可以将整行 bundle 到一个单元格中。您还可以通过为其创建类型来使事情更明确:# CREATE TYPE person(id INTEGER, name VARCHAR);
CREATE TYPE
# SELECT now(), row(3, 'Bob')::person;
now | row
-------------------------------+---------
2012-02-03 10:46:13.279512-07 | (3,Bob)
(1 row)
顺便说一句,每当创建一个表时,PostgreSQL都会创建一个具有相同名称的类型,因此,如果您已经有一个这样的表,那么您也将具有一个类型。例如:# DROP TYPE person;
DROP TYPE
# CREATE TABLE people (id SERIAL, name VARCHAR);
NOTICE: CREATE TABLE will create implicit sequence "people_id_seq" for serial column "people.id"
CREATE TABLE
# SELECT 'foo', row(3, 'Bob')::people;
?column? | row
----------+---------
foo | (3,Bob)
(1 row)
看到在第三个查询中,我像类型一样使用了people
。现在,由于两个原因,这可能不会像您想的那样有多大帮助:
我可能会遗漏一些东西,但是我看不到有很多人在使用这种语法。我在文档中看到的唯一示例是一个将行值作为参数并对其进行处理的函数。我没有看到将行从单元格中拉出并查询其中一部分的示例。看来您可以用这种方式打包数据,但是之后很难解构。您将不得不做很多存储过程。
我不能说NPGSQL,但是由于这是一个非常特定于PostgreSQL的功能,因此您不会在支持其他数据库的库中找到对它的支持。例如,Hibernate将无法处理获取作为单元格值存储在一行中的对象。我什至不确定JDBC是否能够为Hibernate提供有用的信息,因此问题可能会更加严重。
因此,在这里做的是可行的,前提是您可以生活在没有很多琐事的情况下。不过我还是建议不要追求它,因为除非我真的被误导,否则这将是一场艰苦的战斗。