【问题标题】:How to find all the tables having column with CHAR Datatype and having numeric value in it?如何找到所有具有 CHAR 数据类型的列并在其中具有数值的表?
【发布时间】:2020-03-13 06:10:48
【问题描述】:

我想查找所有具有 char 数据类型的列但其中包含数字条目的表,例如,如果有一些表 X 的列 VALID_FLAG CHAR(1) ,那么我必须检查该列的值是否为 0 或1个?

我不知道这个,请指导。

【问题讨论】:

  • 作为一般性评论,您不应该使用char。标准字符串类型是varchar2

标签: sql oracle oracle12c


【解决方案1】:

您无法使用单个查询来实现此目的。您可以在 oracle 中编写 PL/SQL 过程,该过程将执行以下操作:

  1. 获取数据类型为 CHAR 的列的表列表:
select table_name,COLUMN_NAME,DATA_TYPE from ALL_TAB_COLUMNS where data_type='CHAR'
and OWNER='OWNER_NAME';
  1. 然后你可以把 1 或 0 的检查放在一起:
select count(*) from table_name where column_name in ('1','0');

【讨论】:

  • 在 ALL_TAB_COLUMNS 中有一个带有表名值的列,所以我不明白为什么需要 user_tables。另外where column_name=1 or column_name=0; 实际上是where column_name in (0,1)。将字符串与数字进行比较会给你一个错误,所以它实际上应该是:where column_name in ('0','1')
  • 非常感谢...你是对的。我已经更新了答案。
  • 还有一件事,你的第二步应该是:select TABLE_NAME, COLUMN_NAME from all_tab_columns where data_type = 'CHAR' and owner = 'YOUR_OWNER'; 因为 OP 只需要 char 数据类型的列,如果他不遍历所有 sys 表,那就太好了。
  • 你已经更正了一部分而不是全部:dbfiddle.uk/…
  • 哦……我的错……现在我在想为什么我要先选择表列表然后检查数据类型……也许我在实施时会注意到这一点。
【解决方案2】:

您可以利用xmlquery 并在单个查询中找到所需的输出,如下所示:

WITH DATAA AS(select /*+ MATERIALIZE */ owner, table_name, column_name,
  to_number(xmlquery('/ROWSET/ROW/C/text()'
    passing xmltype(dbms_xmlgen.getxml(
      'select count(1) as c '
      || 'from ' || table_name || ' WHERE ' || COLUMN_NAME || ' IN (''0'',''1'')'))
  returning content)) as c
from user_tab_columns
WHERE
    DATA_TYPE = 'CHAR')
SELECT * FROM DATAA
WHERE C > 0;

干杯!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2020-09-07
    • 2020-04-15
    相关资源
    最近更新 更多