Oracle SQL语法 - 检查多列是否为非空

14

有没有更简明的语法来检查多个列是否不为空?我想要简化。

weight IS NOT NULL AND
weight_unit IS NOT NULL AND
length IS NOT NULL AND
width IS NOT NULL AND
height IS NOT NULL AND
dimensional_unit IS NOT NULL

将其变短。

如果相关的话,使用Oracle。


我非常确定这是一个重复的问题,但我似乎找不到它。 - JNK
3
如果您希望避免这种情况(即所有空值),我建议在表上添加 NOT NULL 约束,这样您的查询将永远不需要进行检查。 - Dave Richardson
同意@DaveRlz的建议:建议分别为ThingWeightThingSize设置单独的表,这样如果一个物品的重量未知/不适用等,则不要向ThingWeight表中添加行。 - onedaywhen
你的代码看起来很容易阅读,而且简洁明了...为什么要改成其他的形式呢? - tbone
@tbone:根据我当前的SQL编写方式,我必须重复那个片段四次 - 所以我正在寻找更优美的解决方案。 - jbreed
@DaveRlz:遗憾的是,这个表不在我的控制范围内,我只能从中读取数据。 - jbreed
6个回答

17

应用 德摩根定律

非(A 或 B) = (非A) 且 (非B)

你可以节省20个字符 ;)

NOT (
weight IS NULL OR
weight_unit IS NULL OR
length IS NULL OR
width IS NULL OR
height IS NULL OR
dimensional_unit IS NULL 
)

2
据我所知,没有这样的语法。
但是如果它们全部都是数字,你可以使用以下技巧:
weight + weight_unit + length + width + height + dimensional_unit is not null

7
如果任何一列有索引,那么这将是一个不好的想法,因为它会阻止数据库使用索引来响应查询。最好坚持使用AND。 - Luis Casillas
2
如果有人想将这个技巧应用于varchar2或varchar列的连接,那么它是行不通的。在Oracle中使用连接时,如果B为空,则A || B将变为A。因此,如果任何一个列不为空,'C1 || C2 || C3 || C4'就不会为空。 - Shannon Severance
2
@sacundim - 在这里实际上没有问题。无论如何,6个链接的“IS NOT NULL”条件都不会是索引友好的。 - Martin Smith
@MartinSmith 实际上,IS NOT NULL 条件可以命中索引。通常排除索引访问路径的是 IS NULL 条件。 - Luis Casillas
2
Oracle的B-Tree索引没有空值,而位图索引有。然而,Oracle还有完整索引扫描和快速完整索引扫描访问路径,在某些情况下可以仅从索引中回答查询,而不需要访问表。此外,还有一种索引位图转换访问路径,能够组合多个索引。当您可以使用原始限制的连接时,使用复杂的功能限制并不是一个好主意。数据库更有可能优化后者——不仅是今天的数据库,而且是未来改进版本的数据库。 - Luis Casillas
显示剩余2条评论

0
ALTER TABLE X
   ADD CONSTRAINT C_X_NN
      CHECK (  (
               DECODE (weight, NULL, 0, 1) +
               DECODE (weight_unit, NULL, 0, 1) +
               DECODE (length      , NULL, 0, 1) +
               DECODE (width     , NULL, 0, 1) +
               DECODE (height      , NULL, 0, 1) +
               DECODE (dimensional_unit , NULL, 0, 1)
               ) = 0
            );

-1

我尝试解决这个问题, 如果所有列/变量都是数字或varchar2类型,则可以在sql、pl/sql中使用以下方式:

LENGTH(COL1||COL2||COL3) IS NOT NULL 

希望这能对你有所帮助。

-1
如果您想检查所有列是否都不为空,则可以先将列连接起来,然后一次性测试IS NOT NULL,例如:

weight || weight_unit || length || width || height || dimensional_unit IS NOT NULL

这将检查这些字段中所有值的总和是否不为NULL。

如果只是测试它们中是否可能有一个NULL,那么我认为你在问题中提出的原始语句仍然是最好的方法。


1
他希望它们中没有一个是NULL。你所写的可以用COALESCE更好地编写(wheight,length,...)不为空。 - Florin Ghita
在Oracle中,如果任何一个值不为null,则修订后的答案将返回true,而不是所有答案都不为null(例如:'a' || null = 'a')。 - Allan

-2

这个怎么样...... 如果coalesce(field1,field2,....,fieldn)不为空,则返回

我认为这可以达到目的!!!


2
它不会。如果至少有一个列不为空,则为真,问题是测试所有列是否都不为空。 - Martin Schapendonk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接