如何找到所有具有 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 数据类型的列转换为数字数据类型