Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-从错误的名字/姓氏清除数据库_Sql_Equals_Contains_Startswith - Fatal编程技术网

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

SQL-从错误的名字/姓氏清除数据库,sql,equals,contains,startswith,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 --------------------------------

我有一张桌子,我们在那里储存名字、姓氏和公司名称等

`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)
这没关系,但它只在值存在/不存在时才起作用,但问题是我如何检查例如名字是否以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中,您需要使用该函数添加百分比

下面的查询应该满足您的需要。您需要根据筛选表的内容手动调整条件:

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

匹配文本字符串可以使用或完成

您的示例匹配非常简单,您可以坚持类似的模式。因此,现在您需要构建一个模式,用于每个模式;我可以帮忙

然后,选择那些任何字段与筛选记录中生成的模式匹配的客户记录。这些是您要删除的记录;或者,您可以在其他查询中排除这些记录

选择 c、 公司名称, c、 名字, c、 姓 来自客户作为c 左连接 选择 案例 当运算符='equal'时,则为值 当运算符='以'开头时,则concatvalue,'% 当运算符='contains'时,则连接“%”,值为“%” 以匹配模式结束 从过滤器 作为f 在…上 c、 公司名称如f.匹配模式 或c.第一个名称,如f.匹配模式 或c.姓氏,如f.匹配模式
您正在使用什么rdbms?语法提示MySql。