Oracle (SQL Заявления) - Использование CASE с WHERE CLAUSE - PullRequest
0 голосов
/ 07 апреля 2020

Уважаемые эксперты, я готовил отчет SQL для отображения данных с проверками Format_Check с использованием CASE. Я привел пример, проблемы и ожидания ниже:

Структура таблицы: введите описание изображения здесь

SQL Заявление:

SELECT 

ID,PRODUCT,COMMENTS

CASE WHEN SUBSTR(COMMENTS,1,35)=REGEXP_SUBSTR (COMMENTS,'(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)',1,1)
AND
LENGTH(TRIM(REGEXP_SUBSTR (COMMENTS, '(\S*)(\s)', 1, 2)))=8 
AND
REGEXP_LIKE(TRIM(REGEXP_SUBSTR (COMMENTS, '(\S*)(\s)', 1, 1)),'(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)')
THEN 'Correct Format'
ELSE 'Incorrect_Format'
END AS Format_Check

FROM TEST_TABLE

SQL Выход: введите описание изображения здесь

SQL Объяснение вывода :

  1. Проверяет, является ли столбец КОММЕНТАРИИ длиной 35 символов, также проверяет номера форматов и пробелы. SUBSTR (КОММЕНТАРИИ, 1,35) = REGEXP_SUBSTR (КОММЕНТАРИИ, '(\ d) (\ d) (\ d) (\ d) (\ d) (\ d) (\ d) (\ d) (\ s) (\ г) (\ г) (\ г) (\ г) (\ г) (\ г) (\ г) (\ г) (\ s) (\ г) (\ г) (\ г) (\ г) (\ г) (\ г) (\ г) (\ г) (\ s) (\ г) (\ г) (\ г) (\ г) (\ г) (\ г) (\ г) (\ d) ', 1,1)

  2. Проверяет, является ли длина комментария после первого пробела длиной 8 символов (TRIM (REGEXP_SUBSTR (COMMENTS,' (\ S *) (\ s) ) ', 1, 2))) = 8

  3. Проверяет, первые 8 символов - цифра / цифра. REGEXP_LIKE (TRIM (REGEXP_SUBSTR (КОММЕНТАРИИ, '(\ S *) (\ s)', 1, 1)), '(\ d) (\ d) (\ d) (\ d) (\ d) (\ d ) (\ d) (\ d) ')

Ожидание:

Мне нужен только «Неверный формат» «комментарии, которые будут отображаться при выполнении SQL, я не вижу sh, чтобы увидеть комментарии« Правильного формата ». Однако мне нужен ваш совет относительно того, будет ли этот случай использоваться с предложением WHERE, чтобы отображать только некорректные комментарии формата. Я сослался на предыдущие запросы, связанные с WHERE и CASE, однако я не могу понять, как передать мой случай в предложении WHERE. Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

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

SELECT id, product, comment, format_check
  FROM (
        SELECT id, product, comment, CASE WHEN .... END AS format_check
          FROM test_table
       )
 WHERE format_check = 'Incorrect_Format';

Кстати, на ваш вопрос будет легче ответить, если вы покажете таблицу и данные с SQL вместо изображения, например:

CREATE TABLE test_table (id NUMBER, product VARCHAR2(10), comments VARCHAR2(50));
INSERT INTO  test_table VALUES (1,'Laptop', '00000001 01012020 02022020 03032020');
INSERT INTO  test_table VALUES (1,'PC',     '   00000001 01012020 02022020 0034');

Более того, я считаю, что регулярное выражение можно упростить. Пожалуйста, предоставьте немного больше подробностей, если вы заинтересованы ...

0 голосов
/ 07 апреля 2020

Если вы вообще не хотите sh видеть правильный формат в результате, вы можете пропустить вычисление формата в предложении select. Вместо этого используйте его в предложении Where следующим образом:

SELECT ID,
       PRODUCT,
       COMMENTS,
      'Incorrect_Format' AS format_check
  FROM TEST_TABLE
 WHERE CASE WHEN SUBSTR(COMMENTS,1,35)=REGEXP_SUBSTR (COMMENTS,'(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)',1,1)
AND
LENGTH(TRIM(REGEXP_SUBSTR (COMMENTS, '(\S*)(\s)', 1, 2)))=8 
AND
REGEXP_LIKE(TRIM(REGEXP_SUBSTR (COMMENTS, '(\S*)(\s)', 1, 1)),'(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)')
THEN 'Correct Format'
ELSE 'Incorrect_Format'
END AS = 'Incorrect_Format'
...