如何检查所有行是否验证谓词

时间:2016-06-22 08:11:28

标签: sql oracle

我的数据库中有一个表,我需要检查所有行是否有一个字段不为空。

如果没有行或者至少有一行字段为null =>真

如果有行且它们都是字段而不是null =>假

有没有办法在简单查询中执行此操作?或者我需要首先检查我的表是否为空,然后如果不检查我是否有一个字段值为空的行?

4 个答案:

答案 0 :(得分:1)

这将计算字段中有多少NULL值;

SELECT
SUM(CASE WHEN FieldName IS NULL THEN 1 ELSE 0 END) NullValues
FROM TableName

如果没有NULL值,则返回0,如果有任何值,将返回NULLS的数量。

如果您确实想要将值返回为' True'或者“假”'然后这样做;

SELECT CASE 
        WHEN a.NullValues > 0
            THEN 'True'
        ELSE 'False'
        END CheckField
FROM (
        SELECT 
        SUM(CASE WHEN FieldName IS NULL
                    THEN 1
                ELSE 0
                END) NullValues
        FROM TableName
    ) a

答案 1 :(得分:1)

使用count(*)count(field)并比较两者:

select 
  case when count(*) > 0 and count(*) = count(field) then 1 -- not empty and no nulls
  else 0 end as isgood
from mytable;

Oracle SQL没有布尔数据类型,因此我使用1表示true,0表示false。您可以用您喜欢的任何内容替换它(例如'true'而不是1和'false'而不是0)。

至于将其转换为谓词(与主查询相关),您将使用以下内容:

select ...
from main
where exists
(
  select 1
  from mytable
  where mytable.colx = main.coly
  having count(*) > 0 and count(*) = count(field)
);

答案 2 :(得分:0)

您可以通过聚合执行此操作。但是,很难理解你的要求。如果要检查字段没有NULL值,可以执行以下操作:

select (case when count(*) > 0 then 1 else 0 end) as HasNullValues
from t
where field is null;

答案 3 :(得分:0)

替代方法我发现使用max并首先放置null:

select case when 
    max(field) keep (dense_rank first order by datfin desc nulls first) is null then 1 
    else 0 end as flag 
from MYTABLE;