Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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 使用两个不同的WHERE语句进行选择_Sql_Postgresql - Fatal编程技术网

Sql 使用两个不同的WHERE语句进行选择

Sql 使用两个不同的WHERE语句进行选择,sql,postgresql,Sql,Postgresql,我正在努力解决如何运行select查询,在该查询中,我同时检查两个不同的值,并希望它们位于不同的列中 我的表格示例: ID | foreignID | value | accepted ---------------------------------- 1 | 1 | 5 | Y 2 | 1 | 2 | Y 3 | 1 | 4 | N 4 | 2 |

我正在努力解决如何运行select查询,在该查询中,我同时检查两个不同的值,并希望它们位于不同的列中

我的表格示例:

ID | foreignID | value |  accepted
----------------------------------
 1 |         1 |     5 |         Y
 2 |         1 |     2 |         Y
 3 |         1 |     4 |         N
 4 |         2 |     8 |         Y
我想做的是这样的:

SELECT 
    foreignID, 
    SUM(value WHERE (accepted='Y')) AS sum1,
    SUM(value WHERE (accepted='N')) AS sum2
FROM example
WHERE foreignID='1'
我的预期结果是:

foreignID | sum1 | sum2
------------------------
        1 |    7 |    4
显然,上面的代码不起作用,它只是半个sudo代码来显示我想要的。本质上,我只想用一个异化的方法进行检查,然后从几个求和中得到结果,每个求和都需要自己的参数

有人知道实现这一目标的方法吗,或者类似的方法吗。我试过把它放到

foreignID | sum
        1 |   7
        1 |   4
。。。但那不是我真正想要的

我也看到了这似乎是在正确的轨道上,但再一次,这是使用联合,我不认为是理想的为我的例子

我可能错了,所以如果我错了,请证明我错了。我可能只是忽略了什么!感谢您提供的任何帮助。

试试这个:

SELECT 
    foreignID, 
    SUM(CASE WHEN accepted = 'Y' THEN value ELSE 0 END) AS sum1,
    SUM(CASE WHEN accepted = 'N' THEN value ELSE 0 END) AS sum2
FROM example
WHERE foreignID='1'

这比案例更具可读性:

将布尔值强制转换为整数将导致0或1。许多,如果不是大多数的话,语言都以同样的方式表达。我在四个方面进行了测试:

C

蟒蛇

>>> 7 * True - 2 * False
7
Javascript

<script type="text/javascript">
    document.write(7 * true - 2 * false);
</script>
PHP


postgresql没有GROUP BY吗?您正在寻找函数。如果Foreignd是整数/数字列,则使用Foreignd='1'是个坏主意1'是字符串,1是数字。您应该始终为常量使用正确的数据类型表示法。@a_horse_和_no_name是的,您在这一点上是正确的。我确实注意到了这一点,在写这篇文章的时候,我觉得这很奇怪,但为了保持一致性,我还是保留了它,因为它只是示例代码。我完全是个白痴,因为我忘了那里的CASE函数。为大家的帮助干杯。我不同意这种形式更具可读性。更少的字符通常更具可读性,但并非总是如此。我每天使用这么多不同的语言,以至于我记不起所有语言中关于布尔型转换的规则,有些甚至是不允许的操作!我宁愿把它明确地说出来,也不必每次都去查演员的行为。但如果这对你来说更具可读性,那么对你来说就更有力量了@我用四种顶级语言测试了你的顶级标签。如果java的行为与C不同,那么C和C++就不同了。这些有什么不同?你知道哪些主要语言不是这样的?我的意思是,除了愚蠢的SQL Server和MySQL之外,您的C示例是不正确的——Convert类与casting类不同。C中的inttrue是编译时错误,因为无法强制转换类型。我通常反对关于布尔值的任何强制转换,而更喜欢编写布尔值的等价物?1:0,因为这表明了我的意图。在某些系统中,尤其是较旧的C代码中,将TRUE定义为1,将FALSE定义为2并不少见。即使它在SQL中定义良好,我认为把布尔值作为整数是一个坏主意。我的两分钱,不是否决票或其他什么,这只是我的意见。@cdhowie我一定有世界上最糟糕的记忆之一,因为我总是要重新学习以前已经掌握的东西。我上面写的非常基本的C示例花了我几分钟的时间来编写,尽管仅在3个月前,我就完成了一个复杂asp.net/C应用程序的8个月的单独开发。从那时起,我做了一些不同的事情,但没有做C。所以,如果你喜欢它,我会尽可能明确地理解。我的意思是,在这种情况下,它是如此简单,我更喜欢短路径。但这又取决于每一个人。欢迎发表意见:
>>> 7 * True - 2 * False
7
<script type="text/javascript">
    document.write(7 * true - 2 * false);
</script>
<?php
echo 7 * true - 2 * false;
?>
create table test(
      id int ,
      foreignid int,
      value int,
      accepted char(1)
      )



    INSERT INTO test values (1,1,5,'Y');
    INSERT INTO test values (2,1,2,'Y');
    INSERT INTO test values (3,1,4,'N');
    INSERT INTO test values (4,2,8,'Y');


    select 
    foreignid,
    sum( case when accepted='Y' then value else 0 end) as sumY
    ,sum( case when accepted='N' then value else 0 end) as sumN
    from test
    group by foreignid;