Postgres仅选择满足条件的列

时间:2013-06-13 02:51:10

标签: sql postgresql

如果我有一个包含以下数据的数据库表t1

如何只选择包含术语“false”

的列
 a   |   b   |  c   |  d   
------+-------+------+------
 1    | 2     | 3    | 4
 a    | b     | c    | d
 5    | 4     | 3    | 2
 true | false | true | true
 1    | 2     | 3    | 4
 a    | b     | c    | d
 5    | 4     | 3    | 2
 true | false | true | true
 1    | 2     | 3    | 4
 a    | b     | c    | d
 5    | 4     | 3    | 2
 true | false | true | true

由于

3 个答案:

答案 0 :(得分:4)

假设您要从包含“false”的任何列中选择所有内容,这意味着您希望在这种情况下从列b中选择所有内容:

即使有可能以某种方式 - 尽管我无法想到一个解决方案 - 但这将严重违反关系概念。当你进行选择时,你总是应该事先知道 - 这意味着在设计时,而不是在运行时 - 哪个,特别是你应该得到多少列。特定于数据的列数不是关系数据库的方式。

答案 1 :(得分:2)

我担心最好的方法是编写一些过程代码来从表中选择所有行,并在每一行检查数据以查看哪些值与您的条件匹配。通过将其名称添加到集合来记住包含匹配值的列。

完成完整,痛苦的表扫描后,您的设置将包含您需要的列名。

PL/pgSQL docs

如果有一种方法可以通过某种类似元的SQL查询来选择列,我会感到惊讶,但是人们永远不会知道PostgresQL。有时你必须在程序上做一些事情,这个听起来像就像其中一个案例。

答案 2 :(得分:1)

我是一名SQL Server人员,所以不确定如何做到这一点。我会使用游标迭代表中的每个字段,如果找到值,则将列名插入结果表中。

您可以从表中获取列名:

SELECT column_name 
FROM information_schema.columns 
WHERE table_name='t1'

我认为这应该是确定单个字段是否包含“错误”的最快方法:

SELECT exists (SELECT 1 FROM t1 WHERE a = 'False' LIMIT 1);

所以你应该能够设置一个脚本来使用这两个位来自动化过程。

我也找到了这个可能有用的答案:How to search a specific value in all tables