PostgreSQL视图读取另一个表,转换数据并返回结果

时间:2011-08-30 14:00:44

标签: java postgresql views pljava

有些人可以建议实施此方法的最佳方式:

基本上我想要的是PostgreSQL中的虚拟表,当查询时,它会从其他表中查找数据(将其称为原始数据表)。但问题是,原始数据表中的数据需要进行转换,一旦完成,结果将返回,就像它在原始表中一样。

我将用插图和一个例子(不是我真正的程序,但只是一个简单的例子来解释我需要的主要内容)来解释:

原始数据表

| id (int) | data (byte[]) |
----------------------------
|   ...    |      ...      |
|   ...    |      ...      |

人员表(虚拟表格)

| name (varchar) | address (varchar) | phone (varchar) |
--------------------------------------------------------
|       ...      |        ...        |       ...       |
|       ...      |        ...        |       ...       |
|       ...      |        ...        |       ...       |

我现在想要的是,当我这样做时:

SELECT * FROM person WHERE name = 'Kim';
  • 应查询原始表中的数据,即获取所有byte []数组;
  • 反序列化数据以从原始数据获取(名称,地址,电话);
  • 应用任何条件,即name ='Kim'
  • 将这组结果返回给用户,就像他们只是查询Person表一样。

对于反序列化/转换等,我猜我可能需要一些编程语言函数,所以对于Java来说Pl/Java这样的东西可能有用吗?

此外,您可以假设原始数据表不会很长,它实现为固定大小的缓冲区,因此读取每个查询的所有条目并不是一个大问题。

从概念上讲,我需要的是一个触发器功能,但似乎我们不能在READ上触发。任何关于如何解决这个问题的帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

这个数据库设计对我来说似乎完全没了。您正试图通过错误使用RDBMS来重新实现RDBMS。

但是如果你坚持使用这种设计,我能想到的唯一方法就是编写一个set return函数,以一种程序的方式处理原始数据的所有处理和解包。根据二进制数据的复杂性,PL / pgSQL可能就足够了。

然后,您将执行SELECT * FROM retrieve_person()以获得所需的输出。