Преобразование Oracle SQL в T-SQL с функцией NVL2 в вопрос Case Statement - PullRequest
0 голосов
/ 01 июня 2018

В настоящее время выполняется преобразование операторов Oracle в T-SQL.Вот что я пытаюсь конвертировать:

SELECT USC.USER_ID
  ,NVL2 (MAX(STREET_1), MAX(STREET_1) || CHR (10), '')
|| NVL2 (MAX(STREET_2), MAX(STREET_2) || CHR (10), '')
|| NVL2 (MAX(STREET_3), MAX(STREET_3) || CHR (10), '')
|| NVL2 (MAX(STREET_4), MAX(STREET_4) || CHR (10), '') AS STREETS
  ,MAX(ADDR.CITY) AS CITY
  ,MAX(ADDR.POSTAL_CODE) AS POSTAL_CODE
  ,MAX(ADDR.STATE_ID) AS STATE_ID
  ,MAX(ADDR.COUNTRY_ID) AS COUNTRY_ID
FROM ES_W_USER_CONT_INF USC
LEFT JOIN DW_ERSDB_LDSJOBS_ADDRESS ADDR ON (USC.ADDRESS_ID = 
ADDR.ADDRESS_ID)
GROUP BY USC.USER_ID

Моя лучшая попытка.Я понимаю, что это далеко, но у меня нет большого опыта в написании описаний случаев:

   SELECT USC.USER_ID
  ,CASE 
   WHEN ADDR.STREET_1 IS NOT NULL THEN ADDR.STREET_1 || CHAR (10) 
   WHEN ADDR.STREET_1 IS NULL THEN '' 
   WHEN ADDR.STREET_2 IS NOT NULL THEN ADDR.STREET_2 || CHAR (10) 
   WHEN ADDR.STREET_2 IS NULL THEN '' 
   WHEN ADDR.STREET_3 IS NOT NULL THEN ADDR.STREET_3 || CHAR (10) 
   WHEN ADDR.STREET_3 IS NULL THEN '' 
   WHEN ADDR.STREET_4 IS NOT NULL THEN ADDR.STREET_4 || CHAR (10) 
   WHEN ADDR.STREET_4 IS NULL THEN '' 
   END
  ,MAX(ADDR.CITY) AS CITY
  ,MAX(ADDR.POSTAL_CODE) AS POSTAL_CODE
  ,MAX(ADDR.STATE_ID) AS STATE_ID
  ,MAX(ADDR.COUNTRY_ID) AS COUNTRY_ID
  FROM DSS_ERS_STAGE.ES_W_USER_CONT_INF USC
  LEFT JOIN DSS_ERS_STAGE.ES_W_ADDRESS ADDR ON (USC.ADDRESS_ID = 
  ADDR.ADDRESS_ID)
  GROUP BY USC.USER_ID

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

У вас все еще есть некоторые специфичные для Oracle элементы, и вам не хватает некоторых полезных функций SQL Server.Вот моя попытка преобразования:

 SELECT USC.USER_ID,
   COALESCE(ADDR.STREET_1 + CHAR (10), '') +
   COALESCE(ADDR.STREET_2 + CHAR (10), '') +
   COALESCE(ADDR.STREET_3 + CHAR (10), '') +
   COALESCE(ADDR.STREET_4 + CHAR (10), '') AS Streets,
  ,MAX(ADDR.CITY) AS CITY
  ,MAX(ADDR.POSTAL_CODE) AS POSTAL_CODE
  ,MAX(ADDR.STATE_ID) AS STATE_ID
  ,MAX(ADDR.COUNTRY_ID) AS COUNTRY_ID
FROM DSS_ERS_STAGE..ES_W_USER_CONT_INF USC
LEFT JOIN DSS_ERS_STAGE..ES_W_ADDRESS ADDR 
  ON USC.ADDRESS_ID = ADDR.ADDRESS_ID
GROUP BY USC.USER_ID

Определенные элементы: COALESCE () принимает список параметров и возвращает первое ненулевое значение.Если какое-либо из полей ADDR.STREET_x имеет значение null, конкатенация этого и CHAR (10) также будут нулевыми (если вы не измените ANSI_NULL по умолчанию).

Двойные точки в именах таблиц: я предполагаю, чтоDSS_ERS_STAGE - это имя базы данных.Если в SQL Server используется имя базы данных. Имя таблицы, необходимо указать третий уровень - имя схемы.В этом случае я предполагаю имя схемы по умолчанию (dbo), которое может быть опущено, хотя разделитель должен быть включен.Если бы вы использовали другую схему, скажем, 'db2data', ссылка на таблицу выглядела бы так:

FROM DSS_ERS_STAGE.db2data.ES_W_USER_CONT_INF USC

Надеюсь, это вам поможет.

0 голосов
/ 01 июня 2018

Вы просто сможете поменять NVL2 на COALESCE

SELECT USC.USER_ID
  ,COALESCE((MAX(STREET_1) + CHAR (10), '')
 + COALESCE(MAX(STREET_2) + CHAR (10), '')
 + COALESCE(MAX(STREET_3) + CHAR (10), '')
 + COALESCE(MAX(STREET_4) + CHAR (10), '') AS STREETS
  ,MAX(ADDR.CITY) AS CITY
  ,MAX(ADDR.POSTAL_CODE) AS POSTAL_CODE
  ,MAX(ADDR.STATE_ID) AS STATE_ID
  ,MAX(ADDR.COUNTRY_ID) AS COUNTRY_ID
FROM DSS_ERS_STAGE.ES_W_USER_CONT_INF USC
LEFT JOIN DW_ERSDB_LDSJOBS_ADDRESS ADDR ON (USC.ADDRESS_ID = 
ADDR.ADDRESS_ID)
GROUP BY USC.USER_ID

Возможно, вам придется объединить MAX (CHAR (10)), я не уверен.Это не вопрос функциональности, просто синтаксис с GROUP BY.

...