【问题标题】:selecting only NON NULL values in Oracle sql table在 Oracle sql 表中仅选择 NON NULL 值
【发布时间】:2021-09-13 17:30:22
【问题描述】:

我有一个包含 40 列/标题和 15 行的表(可能会因记录量大而有所不同);在记录/数据中,许多列具有 NULL 值,或者换句话说,这些列不在生产环境中,因此不需要验证或在输出中列出。 即使整个 Column 为 NULL,我也只想在 select 表中列出 NON NULL 值(列虎钳)。

COLUMNS Col_A Col_B Col_C Col_D Col_E Col_F
ROW1 Val_1 Val_2 NULL Val_4 Val_5 Val_6
ROW2 Val_1 Val_2 NULL Val_4 Val_5 NULL

这里我想列出除“C列”之外的所有列,它是NULL

【问题讨论】:

  • " 我只想在选择表中列出 NON NULL 值(列虎钳),即使整个列都是 NULL。" - 这是矛盾的。您能否发布一个源数据和所需输出的简单示例?
  • 列 | Col_A | Col_B | Col_C | Col_D | Col_E | Col_F |以此类推... ROW1 | Val_1 | Val_2 |空 | Val_4 |Val_5| Val_6 |以此类推... ROW2 | Val_1 | Val_2 |空 | Val_4 |Val_5|空 |依此类推......现在我想列出除“Column C”之外的所有列,它是 NULL – @Littlefoot
  • @AntonyPrincePeter 你能把这个例子添加到你的帖子中吗?很难在评论中阅读。
  • 我冒昧地将您的示例复制到问题中。
  • 输出如何呈现?这是在像 APEX、sqlplus 这样的 Web 应用程序中吗?这必须是 sql 还是 pl/sql 也可以?默认情况下,您确定要选择的列,然后使用 WHERE 子句限制行。如果您想从结果集中省略列,因为它们只有 NULL 值,那么您必须进行一些后期处理。

标签: sql oracle


【解决方案1】:

在 sql 中这是不可能的,因为 sql 查询不是这样工作的。简而言之,就是这样

  1. 您告诉数据库引擎您想要返回哪些列以及条件是什么(条件过滤行,而不是列)。此时,数据库对结果一无所知。这是使用查询语法完成的。
  2. 数据库引擎运行查询并逐行返回结果。数据库引擎不知道这些行/列中的内容。

要求是跳过没有数据的。如上所述,在运行查询时不知道这一点,但您可以解决此问题,例如通过创建一个仅包含数据列的视图。请记住,这意味着每个查询必须在查询本身之前至少运行一次,如果您谈论的是大型数据集,这可能是不利的。

让我们创建一个示例表

CREATE TABLE tab1 (c1, c2, c3, c4) AS
(
  SELECT 1,CAST(NULL AS NUMBER), 2,4 FROM DUAL UNION ALL
  SELECT NULL,NULL, 1,3 FROM DUAL UNION ALL
  SELECT 1,NULL, NULL,3 FROM DUAL UNION ALL
  SELECT 1,NULL, 2,NULL FROM DUAL UNION ALL
  SELECT 4,NULL, 3,4 FROM DUAL
);

现在在我们运行查询之前不可能知道哪些列只有 NULL 值,但是我们可以运行一个查询来知道使用像 MAX 这样的聚合函数哪些列只有 NULL 值,MINSUM。让我们称之为QUERY1。例如:

SELECT MAX(c1),MAX(c2),MAX(c3),MAX(c4) FROM tab1;

   MAX(C1)    MAX(C2)    MAX(C3)    MAX(C4)
---------- ---------- ---------- ----------
         4                     3          4

现在我们可以转换该选择,使其生成另一个选择,只选择非空值的列。让我们称之为 QUERY2。

SELECT 
'SELECT '||
RTRIM(
NVL2(SUM(c1),'c1,','') ||
NVL2(SUM(c2),'c2,','') ||
NVL2(SUM(c3),'c3,','') ||
NVL2(SUM(c4),'c4,','')
,',')||' FROM tab1;' FROM tab1;

STMT                                                           
---------------------------------------------------------------
CREATE OR REPLACE VIEW tab1_v AS SELECT c1,c3,c4 FROM tab1;

你去 - 这个语句将只返回没有 NULL 值的列。请注意,这并非万无一失。如果在运行 QUERY1 之后但在运行 QUERY2 之前创建或更新了会改变 QUERY1 结果的行,则它无法选择正确的列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2023-03-12
    • 2018-06-14
    • 1970-01-01
    • 2014-11-12
    相关资源
    最近更新 更多