我有一个表,我们可以在其中存储名字,姓氏和公司名称等。
`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”开头?
答案 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 pattern或the 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函数来添加百分数。