我有一个数据表,我想选择一些按日期过滤的字段。 如果结果为空,则根据sysdate我需要确定它是否正常。 为了能够做到这一点,我正在创建一个带有标志字段的合成表,我期望在结果集中填充该表,即使在该日期我的实际表中没有数据。
WITH const AS (
SELECT
'NAME 1' AS name,
(CASE WHEN TO_TIMESTAMP(TO_CHAR(CURRENT_TIMESTAMP, 'HH24:MI:SS'), 'HH24:MI:SS') < TO_TIMESTAMP('01:00:00', 'HH24:MI:SS') THEN 1 ELSE 0 END) AS flag
FROM
Data_Table
UNION
SELECT
'ANY NAME' AS name,
(CASE WHEN TO_TIMESTAMP(TO_CHAR(CURRENT_TIMESTAMP, 'HH24:MI:SS'), 'HH24:MI:SS') < TO_TIMESTAMP('01:00:00', 'HH24:MI:SS') THEN 1 ELSE 0 END) AS flag )
SELECT Data_Table.sysname, const.flag FROM const LEFT OUTER JOIN Data_Table ON Data_Table.sysname = const.name WHERE Data_Table.date=TO_CHAR(sysdate, 'DD-MM-YYYY')
我希望得到如下结果:
sysname flag
Name1 1
(null) 1
但如果没有该日期的数据,则获得空结果。
答案 0 :(得分:0)
这是一般的例子。如果我理解正确,即使查询没有返回任何行,也需要能够返回一个值:
SELECT table_name FROM all_tables
WHERE table_name = 'YOUR_TABLE'
UNION ALL
SELECT '1' table_name FROM dual
WHERE NOT EXISTS
(
SELECT table_name FROM all_tables
WHERE table_name = 'YOUR_TABLE'
)
/
结果是1,因为没有表格,因为“你的时间”是这样的。在我的数据库中。但是如果我输入一个有效的表名,那么我将从顶部查询中获得结果。如果没有,则始终从第二个查询中获取1或任何其他值。两个查询中的表名必须相同。第二个是最重要的副本。
答案 1 :(得分:0)
我在上一个语句中看到了问题
SELECT Data_Table.sysname, const.flag
FROM const
LEFT OUTER JOIN Data_Table
ON Data_Table.sysname = const.name
WHERE Data_Table.date=TO_CHAR(sysdate, 'DD-MM-YYYY')-- Here is the problem
您正在执行左外连接,然后使用where条件过滤数据,在这种情况下where条件永远不会为真。您需要将该条件推送到连接中,以便它不会影响整体结果:
SELECT Data_Table.sysname, const.flag
FROM const
LEFT OUTER JOIN Data_Table
ON Data_Table.sysname = const.name
AND Data_Table.date=TO_CHAR(sysdate, 'DD-MM-YYYY')