Условные операторы только для определенных типов записей в Oracle - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть таблица как:

________________________________________________________
|  ID   | ADDRESS_LINE1 | CITY   | STATE | ZIP  | TYPE |
________________________________________________________
| 12345 | abcd st       | city1  |   CA  | zip1 |   1  |
| 12345 | abcd st       | city1  |   CA  | zip1 |   2  |
| 12345 | efgh st       | city2  |   CA  | zip2 |   3  |
________________________________________________________

В этой таблице мне нужно проверить, является ли тип 1 или 3, а не 2.

Мне нужен вывод типа :

Для указанной записи таблицы

_______________________________________________________________
|  ID   | RESIDENTIAL_ADDRESS      | MAILING_ADDRESS          |
_______________________________________________________________
| 12345 | abcd st, city1, CA, zip1 | efgh st, city2, CA ,zip2 |
_______________________________________________________________

В случае, если тип 1 отсутствует в таблице

_______________________________________________________________
|  ID   | RESIDENTIAL_ADDRESS      | MAILING_ADDRESS          |
_______________________________________________________________
| 12345 |                          | efgh st, city2, CA ,zip2 |
_______________________________________________________________

В случае отсутствия типа 3 в таблице

_______________________________________________________________
|  ID   | RESIDENTIAL_ADDRESS      | MAILING_ADDRESS          |
_______________________________________________________________
| 12345 | abcd st, city1, CA, zip1 |                          |
_______________________________________________________________

В случае отсутствия обоих типов 1 и 3

_______________________________________________________________
|  ID   | RESIDENTIAL_ADDRESS      | MAILING_ADDRESS          |
_______________________________________________________________
| 12345 |                          |                          |
_______________________________________________________________

Что я пытался :

SELECT DISTINCT ID, 
    ADDRLINE1 || ',' || CITY || ',' || STATE || ',' || ZIP (CASE WHEN TYPE = 1 THEN 1 ELSE 0 END) AS RESIDENTIAL_ADDRESS, 
    ADDRLINE1 || ',' || CITY || ',' || STATE || ',' || ZIP (CASE WHEN TYPE = 3 THEN 1 ELSE 0 END) AS MAILING_ADDRESS 
FROM TABLE
WHERE ID =  12345;

Это выдает ошибку

ORA-00904: ZIP: неверный идентификатор

Я знаю, что что-то упустил. Пожалуйста, помогите оформить запрос.

1 Ответ

2 голосов
/ 09 апреля 2019

Отсутствует разделитель между столбцом ZIP и остальным кодом

Если содержимое дела - это другие столбцы, вам нужна запятая для отдельного столбца ZIP для RESIDENTIAL_ADDRESS и MAILING_ADDRESS

  SELECT DISTINCT ID, 
      ADDRLINE1 || ',' || CITY || ',' || STATE || ',' || ZIP, (CASE WHEN TYPE = 1 THEN 1 ELSE 0 END) AS RESIDENTIAL_ADDRESS, 
      ADDRLINE1 || ',' || CITY || ',' || STATE || ',' || ZIP,  (CASE WHEN TYPE = 3 THEN 1 ELSE 0 END) AS MAILING_ADDRESS 
  FROM TABLE
  WHERE ID =  12345;

Если содержимое дела - это другие столбцы для конкатенации, вам нужно ||, вам нужна запятая для отдельного столбца ZIP для RESIDENTIAL_ADDRESS и MAILING_ADDRESS

  SELECT DISTINCT ID, 
      ADDRLINE1 || ',' || CITY || ',' || STATE || ',' || ZIP || (CASE WHEN TYPE = 1 THEN 1 ELSE 0 END) AS RESIDENTIAL_ADDRESS, 
      ADDRLINE1 || ',' || CITY || ',' || STATE || ',' || ZIP ||  (CASE WHEN TYPE = 3 THEN 1 ELSE 0 END) AS MAILING_ADDRESS 
  FROM TABLE
  WHERE ID =  12345;

или

  SELECT DISTINCT ID, 
      ADDRLINE1 || ',' || CITY || ',' || STATE || ',' || ZIP || ',' || (CASE WHEN TYPE = 1 THEN 1 ELSE 0 END) AS RESIDENTIAL_ADDRESS, 
      ADDRLINE1 || ',' || CITY || ',' || STATE || ',' || ZIP || ',' || (CASE WHEN TYPE = 3 THEN 1 ELSE 0 END) AS MAILING_ADDRESS 
  FROM TABLE
  WHERE ID =  12345;

Если вам нужен результат в одной и той же строке для двух разных строк, вам нужно объединить таблицу дважды для каждого адреса, например:

   SELECT DISTINCT a.ID, 
    a.ADDRLINE1 || ',' || a.CITY || ',' || a.STATE || ',' || a.ZIP AS RESIDENTIAL_ADDRESS, 
    b.ADDRLINE1 || ',' || b.CITY || ',' || b.STATE || ',' || b.ZIP  AS MAILING_ADDRESS 
FROM TABLE a 
INNER JOIN TABLE b ON a.ID = b.ID 
  AND a.TYPE = 1 
  AND b.TYPE = 3 
WHERE a.ID =  12345;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...