#sql #oracle
Eсть таблица со столбцами COL_1 number, COL_2 number, запрос целиком:
SELECT * FROM TABLE_1
И есть представление:
CREATE VIEW V1 AS
SELECT NULL AS COL_1, TABLE_2.COL AS COL_2 FROM TABLE_2
Хочу их объединить:
SELECT * FROM TABLE_1
union all
SELECT * FROM V1
И получаю ошибку - выражения не соответствуют друг другу, ожидалось NULL, в представлении
имеет тип varchar2.
Но я не просил его быть текстовым. Как явно задать тип?
Ответы
Ответ 1
Надо столбцы привести к одному типу. Например для: create table table_1 (col_1 number(10), col_2 number); create table table_2 (col number); будет так: CREATE VIEW V1 AS SELECT CAST (NULL AS number(10)) AS COL_1, TABLE_2.COL AS COL_2 FROM TABLE_2 ; Функция CAST сконвертирует NULL, по умолчанию VARCHAR2(0), в тип данных, указанный во втором операнде. Тот же результат возможно также достигнуть функцией to_number(null), но только если нет необходимости ограничения по длине (т.н. non-constrained type). То есть, например: cast (null as number(10)) ... -- user_tab_cols.data_precision=10 to_number (null) ... -- user_tab_cols.data_precision=null Подробнее в документации.Ответ 2
Можно использовать не cast, а просто To_Number: with tab as ( select 1 as Col_1, 2 as Col_2 from Dual union all select 3, 4 from Dual union all select 5, 6 from Dual union all select 6, 8 from Dual union all select 7, 10 from Dual) select Col_1, Col_2 from tab union all select To_Number(null) as Col_1, Col_2 from tab
Комментариев нет:
Отправить комментарий