我在下表中说“ A”
"column1" "column2"
1 arafath@gmail.com
2 ram@gmail.com;arafath@gmail.com
3 tom@gmail.com
我要获取具有以下条件的记录。
条件1: 如果该列值存在于任何行中,它将检索匹配的行
条件2:
如果列值与任何行都不匹配,则它希望检索所有行
Eg: column2 = "ram@gmail.com"
Output should be "row 2"
Eg: column2 = "arafath@gmail.com"
Output should be "row 1, row 2"
Eg: column2 = "xxx@gmail.com" (Unmatched column)
Output should be all the rows (row 1, row 2, row 3)
请帮助我解决问题。
谢谢。
答案 0 :(得分:0)
我们可以在这里尝试使用工会:
SELECT col1, col2
FROM yourTable
WHERE col2 REGEXP '[[:<:]]ram@gmail.com[[:>:]]'
UNION ALL
SELECT col1, col2
FROM yourTable
WHERE col2 NOT REGEXP '[[:<:]]ram@gmail.com[[:>:]]' AND
NOT EXISTS (SELECT 1 FROM yourTable WHERE col2 REGEXP '[[:<:]]ram@gmail.com[[:>:]]');
上述策略是联合的前半部分返回匹配记录(如果存在)。然后,联合的后半部分将返回所有其他记录,但前提是在联合的前半部分中找到匹配的记录。如果找到了匹配项 ,则联合后半部分的WHERE
子句将失败,并且不返回任何内容。
此外,请注意,在MySQL表中存储逗号分隔(或分号分隔)的数据通常是不明智的做法。我必须使用REGEXP
来解决此问题,但是理想情况下,如果每封电子邮件都有单独的一行,我们只需要使用=
相等。
答案 1 :(得分:0)
请尝试以下一种。
SELECT col1, col2
FROM yourTable
where ( not exists (Select col2
FROM yourTable where col2 like 'xxx@gmail.com')
or col2 like 'xxx@gmail.com');