SQL - Очистка базы данных от неправильного имени / фамилии - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть таблица, в которой мы храним имя, фамилию, название компании и т. Д.

`customers` (
    `Company Name` VARCHAR(100) NOT NULL , 
    `First Name` VARCHAR(100) NOT NULL , 
    `Last Name` VARCHAR(100) NOT NULL 
) 

Это содержит неверные данные, например:

Company Name | First Name | Last Name
--------------------------------------
Why Asking   | bbbToday   | cxzNot
Temp         | CCCttt     | xcy 
Blank        | John       | Travolta
Windows      | Johny      | Bravo

Во второй таблице IУ меня есть фильтр, который я должен использовать для очистки таблицы:

`filter` (
    `operator` VARCHAR(100) NOT NULL , 
    `value` VARCHAR(100) NOT NULL 
) 

operator   | value
------------------------
equal      | cxz
starts with| xcy
contains   | CCC

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

Company Name | First Name | Last Name
--------------------------------------
Blank        | John       | Travolta
Windows      | Johny      | Bravo

Я просто пытаюсь

select * from customers where not exists (select value from filter)

И это нормально, но это работает только тогда, когда значение существует / не существует, но проблема в том, как я могу проверить, начинается ли для примера Имя с "xcy" или "CCC"?

Ответы [ 3 ]

0 голосов
/ 24 февраля 2019

Следующий запрос должен делать то, что вам нужно.Вам необходимо вручную адаптировать условие в соответствии с содержанием таблицы фильтра:

SELECT c.*
FROM customers c
WHERE NOT EXISTS (
    SELECT 1
    FROM filter f
    WHERE 
        ( f.operator = 'equal' AND (f.value = c.FirstName OR f.value = c.LastName))
        OR ( f.operator = 'starts with' AND (c.FirstName LIKE CONCAT(f.value, '%') OR c.LastName LIKE CONCAT(f.value, '%')))
        OR ( f.operator = 'contains' AND (c.FirstName LIKE CONCAT('%', f.value, '%') OR c.LastName LIKE CONCAT('%', f.value, '%')))
)
0 голосов
/ 24 февраля 2019

Соответствие текстовым строкам можно выполнить с помощью оператора LIKE и шаблона или SIMILAR TO и регулярного выражения .

Ваш примерсовпадения достаточно просты, чтобы вы могли придерживаться шаблонов LIKE.Итак, теперь вам нужно создать шаблон для использования с каждым; может помочь CASE оператор .

Затем выберите те записи customer, где любое поле соответствует сгенерированному шаблону из записи filter.Это записи, которые вы хотите удалить;или вы можете исключить эти записи в каком-либо другом запросе.

SELECT
    c.company_name,
    c.first_name,
    c.last_name
FROM customer AS c
    LEFT JOIN (
        SELECT
            CASE
                WHEN operator = 'equal' THEN value
                WHEN operator = 'starts with' THEN concat(value, '%')
                WHEN operator = 'contains' THEN concat('%', value, '%')
            END AS match_pattern
        FROM filter
        ) AS f
        ON (
            c.company_name LIKE f.match_pattern
            OR c.first_name LIKE f.match_pattern
            OR c.last_name LIKE f.match_pattern
        )
0 голосов
/ 24 февраля 2019

Вы можете использовать:

SELECT *
FROM customers c
WHERE
    NOT EXISTS(
        SELECT 1
        FROM filter f
        WHERE
            c."First name" LIKE f.startsWith + '%'
            OR c."First name" LIKE '%' + f.contains + '%'
    )

Вы не сказали, какую СУБД вы используете, поэтому точный синтаксис может немного отличаться.Например, в Oracle вам нужно будет использовать функцию CONCAT для добавления процентов.

...