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

时间:2019-02-24 08:51:20

标签: sql equals contains startswith

我有一个表,我们可以在其中存储名字,姓氏和公司名称等。

`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

在第二张桌子上,我有用来清洁桌子的过滤器:

`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)

没关系,但是仅在值存在/不存在时才起作用,但是问题是我如何检查示例“ First Name”是否以“ xcy”或“ CCC”开头?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

匹配文本字符串可以使用the LIKE operator and a patternthe SIMILAR TO operator and a regular expression

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

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

答案 2 :(得分:0)

您可以使用:

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函数来添加百分数。