Запрос WHERE Только буквенные символы

Я пытаюсь отфильтровать данные в моем листе клиентов Excel для моей компании. Мне нужны три поля: FIRST_NAME, LAST_NAME и COMPANY_NAME.

Правила следующие:

  • FIRST_NAME И LAST_NAME должно быть NOT NULL
  • FIRST_NAME И LAST_NAME должны быть только буквенными
  • Приведенные выше правила не имеют значения, ЕСЛИ COMPANY_NAME является NOT NULL

Итак, просто повторю, чтобы внести ясность. У клиента должны быть FIRST_NAME И LAST_NAME (Они не могут пропустить один или оба), НО, если у него есть COMPANY_NAME, ему разрешено не иметь FIRST_NAME и/или LAST_NAME.

Вот некоторые примеры данных и должны ли они оставаться в данных или нет:

FIRST_NAME | LAST_NAME | COMPANY_NAME |         Good customer?
-----------|-----------|--------------|--------------------------------
   Alex    |  Goodman  |    AG Inc.   | Yes - All are filled out
   John    |  Awesome  |              | Yes - First and last are fine
   Cindy   |           |  Cindy Corp. | Yes - Company is filled out
           |           |   Blank Spa  | Yes - Company is filled out
           |           |              | No - Nothing is filled out
  Gordon   |  Mang#2   |              | No - Last contains non-alphabet
  Jesse#5  |  Levvitt  |    JL Inc.   | Yes - Company is filled out
  Holly    |           |              | No - No last or company names

Вот запрос (с некоторыми удаленными полями в предложении SELECT):

SELECT VR_CUSTOMERS.CUSTOMER_ID, VR_CUSTOMERS.FIRST_NAME, VR_CUSTOMERS.LAST_NAME, VR_CUSTOMERS.COMPANY_NAME, ...
FROM DEV.VR_CUSTOMERS VR_CUSTOMERS
WHERE (
LENGTH(NAME)>4 AND
(UPPER(NAME) NOT LIKE UPPER('%delete%')) AND
(COMPANY_NAME IS NOT NULL OR (COMPANY_NAME IS NULL AND FIRST_NAME IS NOT NULL AND LAST_NAME IS NOT NULL AND FIRST_NAME LIKE '%^[A-z]+$%' AND LAST_NAME LIKE '%^[A-z]+$%'))
)

Я также пробовал регулярное выражение '%[^a-z]%'. Я пробовал RLIKE и REGEXP вместо LIKE, и они тоже не сработали.

В приведенном выше запросе результаты показывают только записи с расширением COMPANY_NAME.


person WolfieeifloW    schedule 15.12.2016    source источник
comment
вы можете создать пользовательскую функцию для этой цели. Взгляните на stackoverflow.com/a/10395393/6348498.   -  person Gurwinder Singh    schedule 15.12.2016


Ответы (2)


Исправлена ​​проблема с использованием REGEXP_LIKE и регулярного выражения ^[A-z]+$.

Вот предложение WHERE после этого исправления:

WHERE (
LENGTH(NAME)>4 AND
(UPPER(NAME) NOT LIKE UPPER('%delete%')) AND
(COMPANY_NAME IS NOT NULL OR (COMPANY_NAME IS NULL AND REGEXP_LIKE(FIRST_NAME, '^[A-z]+$') AND REGEXP_LIKE(LAST_NAME, '^[A-z]+$')))
)
person WolfieeifloW    schedule 16.12.2016

Похоже, вы используете MySQL, учитывая ваше упоминание RLIKE и REGEXP. В этом случае попробуйте это предложение WHERE, в котором используется класс символов регулярных выражений 'альфа':

WHERE 
      COMPANY_NAME is not null    -- COMPANY_NAME being present is the higher priority pass condition 
  or  ( -- but if COMPANY_NAME is not present, then the following conditions must be satisfied 
           FIRST_NAME is not null 
       and FIRST_NAME REGEXP '[[:alpha:]]+' 
       and LAST_NAME is not null 
       and LAST_NAME REGEXP '[[:alpha:]]+' 
      ) 

Имейте в виду, что проверка на ненулевое значение является избыточной для регулярного выражения, поэтому предложение WHERE упростится до:

WHERE 
      COMPANY_NAME is not null    -- COMPANY_NAME being present is the higher priority pass condition 
  or  ( -- but if COMPANY_NAME is not present, then the following conditions must be satisfied 
           FIRST_NAME REGEXP '[[:alpha:]]+' 
       and LAST_NAME REGEXP '[[:alpha:]]+' 
      ) 
person Phylyp    schedule 15.12.2016
comment
Я не думаю, что это MySQL, я на самом деле не уверен, что он использует. Использование REGEXP фактически дает ошибку «недопустимый реляционный оператор». - person WolfieeifloW; 15.12.2016
comment
Альфа не работала, и REGEXP не работал. В итоге я заставил его работать с: (COMPANY_NAME IS NOT NULL OR (COMPANY_NAME IS NULL AND REGEXP_LIKE(FIRST_NAME, '^[A-z]+$') AND REGEXP_LIKE(LAST_NAME, '^[A-z]+$'))) - person WolfieeifloW; 16.12.2016
comment
Приятно слышать, что вы, наконец, заработали - и REGEXP_LIKE, по-видимому, является условием Oracle, так что это также проясняет тайну вашей базовой базы данных! - person Phylyp; 16.12.2016