Как я могу транспонировать таблицу SQL оракула в зависимости от типов столбцов сводной таблицы? - PullRequest
0 голосов
/ 17 июня 2019

У меня есть таблица (phone_item), которая имеет структурный ключ (varchar), значение (varchar), описание (varchar). Мне нужно перенести эту таблицу в другую таблицу (телефон), где column_name = ключ и значения строки должны быть вставлены из столбца значения. Но мне нужно вставить разные типы данных значений, в зависимости от типа данных в телефонной таблице Если тип данных столбца номер, мне нужно преобразовать phone_item.value в число Если дата мне нужно конвертировать в дату и т. Д.

Есть сводная таблица (ТЕЛЕФОН):

CREATE TABLE "TEST_DB"."PHONE" 
   (    
    "PERSON_ID" NUMBER(12,4) NOT NULL ENABLE, 
    "PHONE_ID" NUMBER(12,4) NOT NULL ENABLE, 
    "ID" NUMBER(12,4), 
    "PHONE_TYPE" VARCHAR2(1000 CHAR), 
    "NUMBER" VARCHAR2(1000 CHAR), 
    "PROCESS_DATE" DATE DEFAULT sysdate, 
    "PROCESS_DTIME" TIMESTAMP (6) DEFAULT systimestamp
   ) ;

Необходимо переставить таблицу:

CREATE TABLE "TEST_DB"."PHONE_ITEM" 
   (
    "PHONE_ID" NUMBER(12,4), 
    "KEY" VARCHAR2(1000 CHAR), 
    "VALUE" VARCHAR2(1000 CHAR), 
    "DESCRIPTION" VARCHAR2(1000 CHAR), 
    "PERSON_ID" NUMBER(12,4)
   );

Пример:

+-------------+--------+-------------+
|     key     | value  | description |
+-------------+--------+-------------+
| phoneNumber | 911    |             |
| phoneType   | iPhone |             |
+-------------+--------+-------------+

Мне нужно перенести его на:

+-------------+-----------+
| phoneNumber | phoneType |
+-------------+-----------+
|         911 | iPhone    |
+-------------+-----------+

Я пытался выбрать значения и преобразовать их в разные типы, но получил эту ошибку: ORA-00932: несовместимые типы данных: ожидаемое число получило дату. 00932. 00000 - «несовместимые типы данных: ожидается% s получил% s»

    SELECT max(CASE
                   WHEN (
                           (SELECT Data_type
                            FROM all_tab_columns
                            WHERE TABLE_NAME='PHONE'
                              AND COLUMN_NAME='ID') = 'NUMBER') THEN
                          (SELECT TO_NUMBER(phone_item.value)
                           FROM phone_item
                           WHERE table_id = 45
                             AND phone_id = 43
                             AND phone_item.key='ID')
                   WHEN (
                           (SELECT Data_type
                            FROM all_tab_columns
                            WHERE TABLE_NAME='PHONE'
                              AND COLUMN_NAME='ID') = 'DATE') THEN
                          (SELECT TO_DATE(phone_item.value, 'yyyy')
                           FROM phone_item
                           WHERE table_id = 45
                             AND phone_id = 43
                             AND phone_item.key='ID')
                   ELSE phone_item.value
               END)
    FROM phone_item;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...