SQL - 从错误的名字/姓氏中清理数据库

SQL - Cleaning database from wrong First Name / Last Name

我有 table 我们存储名字、姓氏和公司名称等的地方

`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

在第二个 table 我有过滤器,我应该用它来清洁 table :

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

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

我想要 select 所有没有坏数据的数据,例如:

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

我试试

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

没关系,但它仅在值 exist/not 存在时有效,但问题是我如何检查示例名字是否以 "xcy" 或 "CCC" 开头?

您可以使用:

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 + '%'
    )

您没有说明您使用的是什么 DBMS,因此确切的语法可能会有所不同。例如,在 Oracle 中,您需要使用 CONCAT 函数来添加百分号。

以下查询应该可以满足您的需要。您需要根据过滤器的内容手动调整条件 table :

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, '%')))
)

可以使用 the LIKE operator and a pattern, or the SIMILAR TO operator and a regular expression 来匹配文本字符串。

您的示例匹配非常简单,您可以坚持使用 LIKE 模式。所以现在你需要构建一个模式供每个人使用; the CASE operator 可以提供帮助。

然后,select 那些 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
        )