postgresql:根据其他不完整的数据排除数据

时间:2012-08-24 17:12:38

标签: postgresql filter null

在此数据中 - 有多个DATA_ID值与时间序列数据相关联。我试图从任何DATA_ID值中排除所有数据,为任何时间戳值返回USE的NULL值。

换句话说,我只想返回DATA_ID值(及其数据),如果它们具有所有时间戳值的完整(非任何NULL)值。

以下给出的示例查询:

SELECT   
My.Table.DATA_ID,   
MY.Table.timestamp,   
My.Table.USE

FROM   
My.TABLE

WHERE timestamp BETWEEN '2012-06-01 00:00:00' AND '2012-06-02 23:59:59'

-- Something here that says exclude all data from DATA_ID(s)
-- with any missing USE data,   i.e. USE=NULL

ORDER BY DATA_ID, timestamp

2 个答案:

答案 0 :(得分:1)

假设我正确理解了您的问题,并且您想要排除包含空值的整批样本(由相等的data_id和timestamp确定)。

SELECT   
My.Table.DATA_ID,
MY.Table.timestamp,
My.Table.USE

FROM
My.TABLE o

WHERE timestamp BETWEEN '2012-06-01 00:00:00' AND '2012-06-02 23:59:59'

and not exists (select 1 from my_table i
  where i.use is null
  and i.data_id = o.data_id
  and i.timestamp BETWEEN '2012-06-01 00:00:00' AND '2012-06-02 23:59:59')

ORDER BY DATA_ID, timestamp

答案 1 :(得分:0)

简单的事情是这样的:

CREATE FUNCTION missing_info(MY.TABLE) 
RETURNS BOOL 
LANGUAGE SQL AS
$$ select $1.use is null -- chain conditions together with or. 
   -- no from clause needed.  no where clause needed.
$$;

然后你可以添加:

其中(My.Table).missing_info不是真的;

因为您需要更改缺少哪种信息的逻辑,您可以在功能中更改它,一切仍然有效。

这是对派生信息的封装,其中ORDBMS就像PostgreSQL一样。

编辑:重新阅读您的示例,看起来您正在寻找的是IS NULL运算符。但是,如果您需要重新使用某种逻辑,请参阅上面的示例。 NULL永远不会“等于”NULL(因为我们不能说两个未知值是否相同)。但IS NULL会告诉您它是否为NULL。