Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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:获取第一个匹配项,如果第一个为null,则获取第二个匹配项;如果两者都存在,则获取两个匹配项(PostgreSQL)_Sql_Postgresql_Join_Conditional Statements - Fatal编程技术网

SQL:获取第一个匹配项,如果第一个为null,则获取第二个匹配项;如果两者都存在,则获取两个匹配项(PostgreSQL)

SQL:获取第一个匹配项,如果第一个为null,则获取第二个匹配项;如果两者都存在,则获取两个匹配项(PostgreSQL),sql,postgresql,join,conditional-statements,Sql,Postgresql,Join,Conditional Statements,表1.1在“2014-10-02 00:00:00 UTC”和“2014-10-02”之间创建 23:59:59 UTC”和表2.0在“2014-10-02 00:00:00 UTC”之间创建 和“2014-10-02 23:59:59 UTC” 我还有一些连接和其他查询,但这对我来说很有趣 所以,如果我在第一个表的某个范围内有一些记录,我应该接受它。 如果在第一个和第二个中,则从两个值中选择一个。 如果仅在秒中-从秒开始 现在,如果其中一个表是空的,那么我的结果是空的。 如果我使用OR,我也只

表1.1在“2014-10-02 00:00:00 UTC”和“2014-10-02”之间创建 23:59:59 UTC”和表2.0在“2014-10-02 00:00:00 UTC”之间创建 和“2014-10-02 23:59:59 UTC”

我还有一些连接和其他查询,但这对我来说很有趣

所以,如果我在第一个表的某个范围内有一些记录,我应该接受它。 如果在第一个和第二个中,则从两个值中选择一个。 如果仅在秒中-从秒开始

现在,如果其中一个表是空的,那么我的结果是空的。 如果我使用OR,我也只会有其中一个表中的记录


我应该如何重写查询以获得预期结果?

我建议您将查询分为两个单独的查询,一个针对
表1
日期进行测试,另一个针对
表2
日期进行测试。然后,您可以使用
UNION ALL
将它们组合起来,这将产生您所要求的行为

样本:

SELECT t1.Data1, ...
FROM Table1 t1
    INNER JOIN Table2 t2 ON ...
WHERE t1.Created_at BETWEEN '2014-10-02 00:00:00 UTC' AND '2014-10-02 23:59:59 UTC'
UNION ALL
SELECT t1.Data1, ...
FROM Table1 t1
    INNER JOIN Table2 t2 ON ...
WHERE t2.Created_at BETWEEN '2014-10-02 00:00:00 UTC' AND '2014-10-02 23:59:59 UTC'
编辑

根据你的例子,我会这样做:

SELECT COUNT(*) AS count_all,
    users.id AS users_id 
FROM 
(
    SELECT users.id
    FROM "users" 
        LEFT JOIN table1 ON table1.col1_id = cols1.id 
        LEFT JOIN table2 ON table2.col2_id = cols2.id 
    WHERE "users"."role_id" IN (1,2,4,5,6,7,8)
        AND table1.created_at BETWEEN '2014-09-27 00:00:00 UTC' AND '2014-10-03 23:59:59 UTC' 
    UNION ALL
    SELECT users.id
    FROM "users" 
        LEFT JOIN table1 ON table1.col1_id = cols1.id 
        LEFT JOIN table2 ON table2.col2_id = cols2.id 
    WHERE "users"."role_id" IN (1,2,4,5,6,7,8)
        AND table2.created_at BETWEEN '2014-09-27 00:00:00 UTC' AND '2014-10-03 23:59:59 UTC' 
)
GROUP BY users.id
试试这个:

SELECT *
  FROM table1
 WHERE table1.created_at BETWEEN '2014-10-02 00:00:00 UTC' AND '2014-10-02 23:59:59 UTC' 

UNION ALL

SELECT *
  FROM table2
 WHERE table2.created_at BETWEEN '2014-10-02 00:00:00 UTC' AND '2014-10-02 23:59:59 UTC'

确保表1的列数与表2的列数相同。

PostgreSQL。在标记中更新,将连接条件的逻辑从
切换到
。我已经添加了Paste和我的示例,请根据它应用您的联合所有示例,请:根据您想要的显示,这应该可以做到。我已经添加了Paste和我的示例,根据它应用您的联合所有示例,请问:什么是cols1和cols2,没有这样的别名?它只是表中的另一列。什么表包含这些列?表1和表2相应地,如左图所示