如何找到所有具有 CHAR 数据类型的列并在其中具有数值的表?

Posted

技术标签:

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

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

我不知道这个,请指导。

【问题讨论】:

作为一般性评论,您不应该使用char。标准字符串类型是varchar2 【参考方案1】:

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

    获取数据类型为 CHAR 的列的表列表:
select table_name,COLUMN_NAME,DATA_TYPE from ALL_TAB_COLUMNS where data_type='CHAR'
and OWNER='OWNER_NAME';
    然后你可以把 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;

干杯!!

【讨论】:

以上是关于如何找到所有具有 CHAR 数据类型的列并在其中具有数值的表?的主要内容,如果未能解决你的问题,请参考以下文章

熊猫合并具有不同名称的列并避免重复[重复]

如何将具有数字值的 char 数据类型的列转换为数字数据类型

如何找到表中的所有 NUMERIC 列并对它们执行 SUM() ?

如何从多个表中选择列并在 yii 框架中显示

遍历数据框中的列并在同一张图上绘图(Python)

如何根据数据类型识别列并在pyspark中转换它们?