【发布时间】:2020-03-13 06:10:48
【问题描述】:
我想查找所有具有 char 数据类型的列但其中包含数字条目的表,例如,如果有一些表 X 的列 VALID_FLAG CHAR(1) ,那么我必须检查该列的值是否为 0 或1个?
我不知道这个,请指导。
【问题讨论】:
-
作为一般性评论,您不应该使用
char。标准字符串类型是varchar2。
我想查找所有具有 char 数据类型的列但其中包含数字条目的表,例如,如果有一些表 X 的列 VALID_FLAG CHAR(1) ,那么我必须检查该列的值是否为 0 或1个?
我不知道这个,请指导。
【问题讨论】:
char。标准字符串类型是varchar2。
您无法使用单个查询来实现此目的。您可以在 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');
【讨论】:
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 表,那就太好了。
您可以利用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;
干杯!!
【讨论】: