Как заменить пустые слоты пользовательским сообщением, используя REGEXP_SUBSTR в SQL в Oracle - PullRequest
1 голос
/ 20 апреля 2019

У меня есть задание, где у меня есть таблица «поставщиков», и у каждого поставщика есть описание.Некоторые описания предоставляют адрес электронной почты, а остальные нет.Мне нужно отобразить ТОЛЬКО предоставленное электронное письмо, а если его нет, мне нужно отобразить «Не указано электронное письмо».Мне было легко извлечь адреса электронной почты, но я не могу понять, как заменить все пустые слоты запрошенным сообщением.

Я пробовал несколько, возможно, очень неправильных, методов:

Попытка 1:

SELECT REGEXP_SUBSTR(description, '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}') OR 'No email provided' "Supplier emails" FROM suppliers;

Попытка 2: (Примечание.других идей)

SELECT REGEXP_SUBSTR(description, '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}') || 'No email provided' "Supplier emails" FROM suppliers;

Попытка 3:

SELECT REGEXP_SUBSTR(description, '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}', 'No email provided') "Supplier emails" FROM suppliers;

Попытка 4:

SELECT REGEXP_SUBSTR(description, '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}') "Supplier emails" FROM suppliers;
SELECT REPLACE('-', "No Email Provided") FROM suppliers;

IЯ пытался найти это в Google с различными вариантами формулировок, и учебник, который у меня есть, не дает четкого объяснения этой конкретной ситуации.

Вот таблица, которую я использую, для контекста о результатах:

INSERT INTO suppliers
  VALUES ('Second Hand Reads', 
         'wholesaler of used books only, located in Chicago, 634.555-8787');
INSERT INTO suppliers
  VALUES ('Leftovers', 
     'Physical store location, located in Seattle, willing to fill referred sales, sales@leftovers.com');
INSERT INTO suppliers
  VALUES ('Read Again', 
 'Chain of used book store fronts, seeking online sales partner, located in western U.S., 919-555-3333');
INSERT INTO suppliers
  VALUES ('Bind Savers', 'Used book wholsaler, stock includes international titles, 402-555-2323');
INSERT INTO suppliers
  VALUES ('Book Recyclers', 'Used book chain, located in Canada, large volume of sales, 888.555.5204');
INSERT INTO suppliers
  VALUES ('Page Shock', 'Book wholsaler for specialty books and graphic novels, help@pageshock.com');
INSERT INTO suppliers
  VALUES ('RePage', 'Used book vendor, only wholesales, Wash D.C., 555-0122');
COMMIT;

Ожидаемый вывод:

                           Supplier emails
------------------------------------------------------------------
No email provided
--------------------
sales@leftovers.com
--------------------
No email provided
--------------------
No email provided
--------------------
No email provided
--------------------
help@pageshock.com
--------------------
No email provided

Но вывод был либо ошибочным, либо ожидаемым, который не сработал

                           Supplier emails
------------------------------------------------------------------
No email provided
-------------------------------------
sales@leftovers.comNo email provided
-------------------------------------
No email provided
-------------------------------------
No email provided
-------------------------------------
No email provided
-------------------------------------
help@pageshock.comNo email provided
-------------------------------------
No email provided

1 Ответ

3 голосов
/ 20 апреля 2019

Вам необходимо использовать либо функции NVL, либо COALESCE:

SELECT STORE_NAME,
       DESCRIPTION,
       NVL(REGEXP_SUBSTR(description, '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}'),
           'No email provided') AS EMAIL
  FROM SUPPLIERS

dbfiddle здесь

NVL принимает два аргумента. Если первый аргумент не равен NULL, он возвращает его; в противном случае он возвращает второй аргумент.

COALESCE аналогичен NVL, но он принимает столько аргументов, сколько вы хотите предоставить, и возвращает первый аргумент, который не равен NULL. Если все аргументы равны NULL, COALESCE вернет NULL.

Удачи.

...