【发布时间】:2011-02-12 06:23:12
【问题描述】:
是否可以在 PostgreSQL 中进行选择性查询,根据已选择的行的值选择不同的表/列?
基本上,我有一个表格,其中每行包含一个由两到五个字符组成的序列 (tbl_roots),可选的还有一个长度字段,用于指定该序列应该包含多少个字符(它的意思是一旦我找到更好的方法,即通过计算序列的长度,就变得多余了)。
有四个表包含模式(tbl_patterns_biliteral、tbl_patterns_triliteral、...等),每个表对应一个root_length,第五个表(tbl_patterns)用于同步模式通过为每一行提供一个标识符来创建表格,因此tbl_patterns_biliteral 中的第 2 行对应于tbl_patterns_triliteral 中的同一行。这六个模式表受到限制,因此tbl_patterns_(bi|tri|quadri|quinqui)literal 中的任何行都不能有pattern_id 中不存在的tbl_patterns。
每个模式表都有其他九列对应于一个标识符 (root_form)。
数据库中的最后一个表 (tbl_words) 包含每个主要表 (word_id、root_id、pattern_id、root_form、word) 的列。每个单词都被定义为特定长度和形式的词根,拼接成特定的模式。拼接比较简单:translate(pattern, '12345', array_to_string(root, '')) as word_combined 就可以了。
现在,我要做的是根据tbl_roots中的序列长度选择合适的模式表,并根据root_form的值在模式表中选择合适的列。
如何做到这一点?它可以组合成一个简单的查询,还是我需要进行多次传递?一旦我建立了这个查询,我就可以将它编码成一个可以搜索我的数据库的 PHP 脚本。
编辑
这里有一些示例数据(实际上是我目前正在使用的数据)以及关于系统如何工作的更多解释:https://gist.github.com/823609
它在概念上比最初看起来更简单,尤其是当您将其视为坐标系时。
【问题讨论】:
-
您能发布 DDL 和一些示例数据吗?我很确定这是可以做到的,但不是你看到的那样。
-
最好将示例数据发布为 INSERT 语句。控制台输出不能轻易用于快速设置测试环境
-
我已经更新了 Gist,所以它应该包含正确的语句,但我没有测试它们,所以我不确定。
-
@Catcall 我再次更新了 Gist,因此它具有表定义和用于插入示例数据的 SQL 语句;不过,插入根字符数组的语法可能是错误的。
-
我会小心使用数组。不熟悉您的域,tbl_root.root 的长度总是 3 吗?如果它可以改变长度或者你需要搜索它可能会成为一个非常头疼的问题。当您可以索引它们并知道这意味着什么时,数组就可以了,例如帐户周期的 Quarter[1] 独立存在。如果不是,你基本上有一个隐藏的嵌套表,不会是关系声音。
标签: database postgresql select