Сложный регистр в Oracle SQL - PullRequest
       6

Сложный регистр в Oracle SQL

0 голосов
/ 20 декабря 2018

У меня есть сценарий, в котором у меня есть 4 столбца - SUBBRAND, COLLECTIONS, PLCYCLE, COLORFAMILY, и я должен назначить приоритет записям:

  1. Если все 4 из них имеют допустимые значения (не пустые илине нуль) - Приоритет '1';
  2. Если любые 3 из них имеют действительные значения (не пустые или не нулевые) - Приоритет '2';
  3. Если любые 2 из них имеют действительные значения(не пусто или не пусто) - приоритет «3»;
  4. Если любое из них имеет допустимые значения (не пусто или не пусто) - приоритет «4».

Isсоставление описания случая со всеми возможными комбинациями - единственный способ сделать это или есть простой способ сделать это?

пример кода:

CASE WHEN SUBBRAND IS NOT NULL AND COLLECTIONS IS NOT NULL 
     AND PLCYCLE IS NOT NULL AND COLORFAMILY  IS NOT NULL
     THEN 1 AS PRIORITY,
     WHEN SUBBRAND IS NOT NULL AND COLLECTIONS IS NOT NULL 
     AND PLCYCLE IS NOT NULL OR
     WHEN COLLECTIONS IS NOT NULL AND PLCYCLE IS NOT NULL 
     AND COLORFAMILY IS NOT NULL OR
     WHEN PLCYCLE IS NOT NULL AND COLORFAMILY IS NOT NULL
     AND WHEN SUBBRAND IS NOT NULL OR
     so on....
     THEN 2 AS PRIORITY
     and other conditions..
END PRIORITY

Заранее спасибо за вашу помощь!

Ответы [ 4 ]

0 голосов
/ 21 декабря 2018

Размещение окончательного кода (вроде), который работает для меня.Спасибо всем за помощь и большое СПАСИБО forpas за всю вашу помощь :)будет 100 М или более, ок.

0 голосов
/ 20 декабря 2018

Может быть, сначала посчитать значения NULL:

SELECT 1 /* highest priority */ + 
       /* increase priority for each non-empty value */ 
       + NVL2(SUBBRAND, 0, 1) + NVL2(COLLECTIONS, 0, 1) + NVL2(PLCYCLE, 0, 1) + NVL2(COLORFAMILY, 0, 1) 
  AS PRIORITY
...

Как заметил dlatikay: вы должны решить, что делать, если все значения пусты.В приведенном выше решении приоритет будет 5, это то, что вы хотите?

0 голосов
/ 20 декабря 2018

NVL2() удобно, если пробел означает отсутствие символов.Однако, если «пробел» допускает пробелы или другие символы, вам нужна логика case.Я бы пошел на:

SELECT (1 +
        NVL2(TRIM(' ' FROM SUBBRAND), 0, 1) + 
        NVL2(TRIM(' ' FROM COLLECTIONS), 0, 1) + 
        NVL2(TRIM(' ' FROM PLCYCLE), 0, 1) + 
        NVL2(TRIM(' ' FROM COLORFAMILY), 0, 1) 
       ) AS Priority
0 голосов
/ 20 декабря 2018

В Oracle пустые строковые значения обрабатываются как NULL, поэтому вам нужно только проверить на NULL.Используйте NVL2 для получения 0, если NULL и 1, в противном случае:

SELECT 
  5 - ( 
  NVL2(SUBBRAND, 1, 0) + 
  NVL2(COLLECTIONS, 1, 0) + 
  NVL2(PLCYCLE, 1, 0) + 
  NVL2(COLORFAMILY, 1, 0) 
  ) AS Priority

Я полагаю, что ни один из четырех столбцов не будет иметь значение NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...