2016-12-15 14 views
0

Я пытаюсь отфильтровать данные в листе моих клиентов Excel для своей компании. Три поля, которые мне нужны, это FIRST_NAME, LAST_NAME и COMPANY_NAME.Query WHERE Только буквенные символы

Правилами заключаются в следующем:

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

Итак, просто повторить, чтобы быть ясным. Клиент должен иметь FIRST_NAME И a 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]+$%')) 
) 

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

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

+0

вы можете создать пользовательскую функцию для этой цели. Взгляните на http://stackoverflow.com/a/10395393/6348498 – GurV

ответ

1

Исправлена ​​ошибка с использованием 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]+$'))) 
) 
0

похоже, вы используете MySQL, учитывая свое упоминание о RLIKE и REGEXP. В этом случае, попробуйте это ИНЕКЕ, которая использует regular expression character class 'alpha':

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 
     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:]]+' 
    ) 
+0

Я не думаю, что это MySQL, на самом деле я не уверен, что он использует. Использование REGEXP фактически дает ошибку «неверный реляционный оператор». – WolfieeifloW

+1

Alpha не работал, и REGEXP не работал. Я закончил работу с: '(COMPANY_NAME не является NULL ИЛИ (COMPANY_NAME NULL AND REGEXP_LIKE (FIRST_NAME, '^ [Az] + $') И REGEXP_LIKE (LAST_NAME, '^ [Az] + $'))) ' – WolfieeifloW

+1

Приятно слышать, что вы в конечном итоге работали - и REGEXP_LIKE, по-видимому, является условием Oracle, так что также разъясняет тайну вашей базовой базы данных! – Phylyp

 Смежные вопросы

  • Нет связанных вопросов^_^