假设我有一个像
这样的查询select a.column1, b.column2, substr(b.column3,instr(b.column3,',')) as Column3
from tableA a, tableB b
where a.column1 = b.column1
如何获取此查询的每一列的最大字符长度?
如果tableA和tableB定义为
tableA ( column1 VARCAHR2(100))
tableB ( column1 VARCAHR2(100), column2 INTEGER, column3 VARCAHR2(5000))
我想获得这些数据:
COLUMN1 : 100
COLUMN2 : 10
COLUMN3 : 5000
请记住,这是一个动态查询,限制范围内任意数量的表可能有任意数量的列。
答案 0 :(得分:2)
您可以在查询(CTAS)中创建一个表格,然后使用user_tab_columns
为您的新表格获取列data_length
。
create table temp as
select a.column1, b.column2, substr(b.column3,instr(b.column3,',')) as Column3
from tableA a, tableB b
where a.column1 = b.column1
--No need for store the data, unless you want the maximum size of current data.
and 1 = 0;
select column_name, data_length from user_tab_columns where table_name = 'TEMP';
drop table temp;
这非常简单,您无需关心查询中的确切内容。 Oracle会为您解决这个问题。
顺便说一句。 VARCHAR2
的最大大小为4000.除非您使用12c扩展数据类型,否则不能有5000。
答案 1 :(得分:0)
您可能必须访问USER_TAB_COLUMNS
元数据表才能获得这些列长度
以下是一个示例查询
SELECT COLUMN_NAME
,CHAR_LENGTH
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME IN ('tableA', 'tableB')
AND COLUMN_NAME IN ('column1', 'column2', 'column3')
;
如果您在生成的查询中需要上述内容,则需要更改为以下内容
select a.column1
, b.column2
, substr(b.column3,instr(b.column3,',')) as Column3
, (SELECT CHAR_LENGTH FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'tableA' AND COLUMN_NAME = 'column1') AS column1_size
, (SELECT CHAR_LENGTH FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'tableB' AND COLUMN_NAME = 'column2') AS column2_size
, (SELECT CHAR_LENGTH FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'tableB' AND COLUMN_NAME = 'column3') AS column3_size
from tableA a
, tableB b
where a.column1 = b.column1
以上是这样做的一种方式。根据您要执行的操作以及生成查询的方式,我认为您希望将列大小放在单独的查询中,就像第一个查询一样,因为您在生成查询时已经知道了列和表名。 / p>
希望这会有所帮助..