我试图选择一些字段,其中一个字段需要一个数组,数组的每个元素都包含两个值.每个数组项都需要包含一个名称(字符变化)和一个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)
这样就可以让整个行整合到一个单元格中.您也可以通过为其创建类型来使事情更加明确:
# 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','Bob')::people; ?column? | row ----------+--------- foo | (3,Bob) (1 row)
在第三个查询中看到,我使用的人就像一个类型.
现在这不太可能有你的想法有两个原因:
>我找不到任何方便的语法来拉出嵌套行中的数据.
我可能会缺少某些东西,但是我看不到有很多人使用这种语法.我在文档中看到的唯一的例子是将行值作为参数并对其进行处理的一个函数.我没有看到一个例子,将行从单元格中拉出来并查询其中的一部分.看起来你可以用这种方式打包数据,但是之后很难解构.你必须要做很多的存储过程.
>您的语言的Postgresql驱动程序可能无法处理嵌套在行中的行值数据.
我不能说NPGsql,但由于这是一个非常Postgresql特定的功能,您不会在支持其他数据库的库中找到支持.例如,Hibernate将无法处理在一行中获取存储为单元格值的对象.我甚至不确定JDBC能够给予Hibernate有用的信息,所以问题可能会相当深入.
所以,你在这里做的事情是可行的,只要你能活下去,没有很多的好处.我建议不要追求它,因为这将是一场艰苦的战斗,除非我真的是错误的.