Страницы

Поиск по вопросам

воскресенье, 22 декабря 2019 г.

Как явно задать тип для значения NULL в SELECT?

#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

Комментариев нет:

Отправить комментарий