2016-11-12 5 views
0

Я одну таблицу с именем L0, который создается как:Мне нужно изменить один тип данных таблицы так же, как и в netezza, просто передав имя таблицы?

create table L0 (
    name varchar, 
    number varchar, 
    address varchar 
); 

Тип данных для всех столбцов присутствует в L0 является varchar,

Я еще одна таблица L1, которая создается как:

create table L1 (
    name varchar, 
    number int, 
    address char 
); 

Я хочу преобразовать типы данных из таблицы L0 как те же, что и для L1, всего лишь pa ssing имя таблицы.

Я хочу, чтобы окончательный вид запроса, как это:

select cast(name as varchar), cast(number as int), cast(address as char) from L0 
minus 
select * from L1: 

Какой способ сделать это?

+0

Непонятный. Что вы здесь делаете? –

ответ

0

Если у вас есть group_concat UDA установлен в Netezza, то вы можете получить желаемый результат с использованием представления columns метаданные

create table L0 (
    name varchar(20), 
    number varchar(10), 
    address varchar(50) 
); 

create table L1 (
    name varchar(50), 
    number int, 
    address char(20) 
); 

Запрос:

SELECT 'select ' || system..group_concat('cast (' || a.column_name || ' as ' || b.data_type || ')') || ' from ' || a.table_name || ' minus select ' || system..group_concat(b.column_name) || ' from ' || b.table_name || ' ;' 
FROM columns a 
    ,columns b 
WHERE a.column_name = b.column_name 
    AND a.table_name = 'L0' 
    AND b.table_name = 'L1' 
    AND a.table_catalog = 'TEST' --- this is the current database name 
GROUP BY a.table_name 
    ,b.table_name; 

Выход:

SELECT cast(ADDRESS AS CHARACTER(20)) 
    ,cast(NAME AS CHARACTER VARYING(50)) 
    ,cast(NUMBER AS INTEGER) 
FROM L0 minus 

SELECT ADDRESS 
    ,NAME 
    ,NUMBER 
FROM L1; 

РЕДАКТИРОВАТЬ: Альтернативный подход с использованием хранимой процедуры

CREATE OR REPLACE PROCEDURE GRP_CONCAT(varchar(50),varchar(50)) 
RETURNS VARCHAR(ANY) 
EXECUTE AS OWNER 
LANGUAGE NZPLSQL AS 
BEGIN_PROC 
DECLARE 
    TABLE_NAME1 ALIAS FOR $1; 
    TABLE_NAME2 ALIAS for $2; 
    return_text varchar(10000) := 'SELECT'; 
    x record; 
BEGIN 
FOR x IN select a.column_name as colname,b.data_type datatype 
FROM columns a 
    ,columns b 
WHERE a.column_name = b.column_name 
    AND a.table_name = TABLE_NAME1 
    AND b.table_name = TABLE_NAME2 
    order by b.ordinal_position 
    LOOP 
    return_text := return_text || ' CAST ('||x.colname ||' as '||x.datatype||') , '; 

    end loop; 



    return_text := trim(return_text,' , ')||' FROM '||TABLE_NAME1 || ' minus select * from '||TABLE_NAME2||';'; 

    return return_text; 
EXCEPTION WHEN OTHERS THEN 
RAISE NOTICE 'ERROR: %', SQLERRM; 
RETURN 1; 
END; 

END_PROC; 

Выход:

Вызов GRP_CONCAT ('L0', 'L1');

SELECT CAST(NAME AS CHARACTER VARYING(50)) 
    ,CAST(NUMBER AS INTEGER) 
    ,CAST(ADDRESS AS CHARACTER(20)) 
FROM L0 minus 

SELECT * 
FROM L1; 
+0

hello group concat не работает в моей системе, можете ли вы предложить какой-либо альтернативный способ заблаговременно? –

+0

@gagansharma обновил мой ответ, используя хранимую процедуру Netezza – NzGuy

 Смежные вопросы

  • Нет связанных вопросов^_^