1

如果我有一个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

谢谢

4

3 回答 3

4

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

即使这可能以某种方式实现——尽管我想不出一个解决方案——这将严重违反关系概念。当您进行选择时,您总是应该事先知道 - 这意味着在设计时,而不是在运行时 - 您应该知道哪些,尤其是应该获得多少列。数据特定的列计数不是关系数据库的方式。

于 2013-06-13T03:00:19.150 回答
2

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

当您完成完整的、痛苦的表扫描后,您的集合将包含您需要的列名。

PL/pgSQL 文档

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

于 2013-06-13T03:07:10.433 回答
1

我是一个 SQL Server 人,所以不知道你是如何做到这一点的。我将使用游标遍历表中的每个字段,如果找到值,则将列名插入结果表中。

您可以使用以下方法从表中获取列名:

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

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

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

因此,您应该能够设置一个脚本来使用这两个位自动执行该过程。

我还发现这个答案可能会有所帮助: How to search a specific value in all tables

于 2013-06-13T03:54:09.477 回答