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
)
我有 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
)