2016-01-30 75 views
1

假設我有一個像Oracle:如何從動態生成的查詢中獲取最大列長度?

select a.column1, b.column2, substr(b.column3,instr(b.column3,',')) as Column3 
from tableA a, tableB b 
where a.column1 = b.column1 

我如何得到這個查詢的每列最大字符長度查詢?

如果表A和tableB的被定義爲

tableA (column1 VARCAHR2(100))  
tableB (column1 VARCAHR2(100), column2 INTEGER, column3 VARCAHR2(5000)) 

我想獲得這些數據:

COLUMN1 : 100 
COLUMN2 : 10 
COLUMN3 : 5000 

請記住,這是一個動態的查詢,有可能是來自任何數量的列限制內的任何數量的表格。

+0

所以你想要填充所有行的列長度? – Utsav

+0

我認爲,就你而言,[解析函數](http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions004.htm#SQLRF06174)可以做到這一點。 'SELECT MAX(LENGTH(a.column1))OVER(PARTITION BY NULL)as max_a_column1_len ...'。 – AndrewMcCoist

+0

@Utsav,我希望每個列的最大可能字符長度爲 – Frank

回答

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。

+0

請注意,SUBSTR可以接受CLOB並返回CLOB。 –

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 

以上是以此爲例的一種方法。根據你想要做什麼以及你如何生成查詢,我想你會希望像第一個那樣在一個單獨的查詢中獲得列大小,因爲在生成查詢時你已經知道列和表名。

希望這有助於..

相關問題