如何获取没有数据的行

时间:2019-10-18 04:24:10

标签: sql oracle

我有一个名为Temp的表,该表约有15列。 在该表中,col1是主键,其余所有都是普通键(可能具有空值) 我已经将数据和日期(在col15中)一起插入了表中。 如果该数据不适用于除主键列之外的所有列,则 我插入了主键列值和日期列值(列15) 并为所有剩余列提供空值。

Temp
------------------------------------------------------
col1  col2 col3 col4 col5 ....................col15
------------------------------------------------------
o124  xxx   xxx  xxx  null                    2019-10-17
o236  null  xxx  xxx  xxxx                    2019-10-17
o437  xxx   xxx  null xxxx                    2019-10-17
o448  xxx   null xxx  xxxx                    2019-10-17
o456  null  null null null                    2019-10-17
o458  null  null null null                    2019-10-17

现在,我想获取除主键列(column1)和日期列(column 15)之外的所有列中都没有值的行。

输出应为

------------------------------------------------------
col1  col2 col3 col4 col5 ....................col15
------------------------------------------------------
o456  null  null null null                  2019-10-17
o458  null  null null null                  2019-10-17

我应该写什么查询?

谢谢

3 个答案:

答案 0 :(得分:3)

“查找除1和15以外的所有列均为空的地方”:

SELECT * 
FROM temp
WHERE
  --col1 is PK and won't be null so we don't need to check it
  col2 IS NULL AND
  col3 IS NULL AND
  ...
  col14 IS NULL AND
  col15 IS NOT NULL --check it if it's a hard requirement that it must still have a value

请注意,尽管来自Tejash的查询将起作用,但作为一般规则,请尝试避免使用对表值进行操作的函数,但应在where子句中使用它,因为这意味着oracle必须评估每一行的函数结果(是数百万个评估),并且通常会禁止使用索引(除非指定了功能索引,这种情况很少见)。在这种情况下,除非您创建带有标志以指示所有字段是否为空的另一列,否则这个查询甚至不可能被合理地索引,但是对于真正更一般的情况,请谨慎使用;例如,请勿将一百万个日期转换为字符串以使其与单个字符串参数竞争,将单个字符串参数转换为日期并将其与表中的日期进行比较(非转换行数据)

答案 1 :(得分:2)

您可以简单地使用coalesce函数:

Select * from your_table 
Where coalesce(col2, col3, col4, ... , col14) is null;

干杯!

答案 2 :(得分:-1)

select * from Temp where (col2 != null or col3 != null or ... or col14 != null)这样的东西应该没问题。