Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在我的sql表上应用多个过滤器_Sql_Database_Postgresql_Filter_Relational Division - Fatal编程技术网

如何在我的sql表上应用多个过滤器

如何在我的sql表上应用多个过滤器,sql,database,postgresql,filter,relational-division,Sql,Database,Postgresql,Filter,Relational Division,我正在努力解决sql中的关系划分问题。我需要根据多个条件从同一个表中筛选数据。下面是我的表的模式 | -------|----------------|-----------------|----------------| |ID |Question |RespondentId |Answer | | -------|----------------|-----------------|----------------| |1 |Bi

我正在努力解决sql中的关系划分问题。我需要根据多个条件从同一个表中筛选数据。下面是我的表的模式

| -------|----------------|-----------------|----------------|
|ID      |Question        |RespondentId     |Answer          |
| -------|----------------|-----------------|----------------|
|1       |Big             |1                |Yes             |
|2       |Big             |2                |Yes             |
|3       |Big             |3                |No              |
|4       |Gender          |1                |Male            |
|5       |Gender          |2                |Female          |
|6       |Gender          |3                |Female          |
|7       |Children        |1                |No              |
|8       |Children        |2                |Yes             |
|9       |Children        |3                |No              |
--------------------------------------------------------------
我需要从这个名为答案的表格中得到与以下过滤器相匹配的答案:每个问题的答案分别为:问题=大和小,答案=是和是。因此,如果我有一个正确的Sql查询,我的结果应该返回以下数组:[2],因为只有一行对问题Big的答案为Yes,而对问题Children的答案为Yes,这一行的RespondentId=2

此外,提供的问题和答案不是固定的,应该是模块化的。例如,我应该能够更改答案或删除问题,而不必更改查询的整个结构


你能帮我找到这个问题的正确答案吗?我一直在寻找@Erwin Brandstetter提供的许多解释,但没有一个符合我的需要。

您可以检查结果,即符合问题和答案where条件的行的计数为2

select RespondentId 
from Answers 
when question in ( 'Big', 'Children')
and Answer ='Yes' 
group by RespondentId having count(*) = 2 

我想你要找的是旋转桌子。不同的数据库有不同的语法。您可以有效地将问题列的值转换为它们自己的列,然后查找与您的条件匹配的行

下面是一个标准SQL中效率低下的示例,我为每个问题创建一个表,并使用RespondentId将它们连接到一个表中

从中选择响应者id 从问题=‘大’的答案中选择*作为大 参加 从答案中选择*,其中问题=‘儿童’为儿童 在…上 big.responder\u id=children.responder\u id 哪里 答案=‘是’ 和 答案=‘是’

我会这样做:

select a.RespondentId 
from Answers a
when (question, answer) in ( ('Big', 'Yes'), ('Children', 'Yes') )
group by RespondentId
having count(*) = 2 ;
这很容易概括为:

with qa as (
      select v.*
      from (values ('Big', 'Yes'), ('Children', 'Yes')
     ) v(question, answer)
select a.RespondentId 
from Answers a join
     qa
     on a.question = qa.question and a.answer = qa.answer
group by RespondentId
having count(*) = (select count(*) from qa);

这是相当普遍的。您甚至可以安排CTE获取一个数组或json参数,并将其解析为单独的比较值。

非常感谢您的回答@scaisEdge,但在这种情况下,如果我想让我对儿童问题的回答为“否”,我会对查询的这种结构感到困惑。@MartinDelobbe。我的答案是对的还是错的??它回答了我问题的第一部分,但不是关于模块化的第二部分。查询是一个查询。。并根据条件进行筛选。。您不能有一个管理所有条件的查询。。这是SQL的思维方式。。您应该深入了解集合论,以便正确地管理SQL,这是肯定的,但您的答案对于我的用例来说太具体了。不过,如果你有其他的解决办法,我会非常高兴!