假设我在 MySQL 数据库中有一个 Table1
表。该表有一个名为 string
的列。这是一个例子:
**Table1**
mytext
my-text
some-text
no-text
notext
yes-dash
yesdash
no-dash
我想从 Table1
中获取 string
的行,这些行与仅匹配字母字符和单个破折号 (-
) 的 REGEXP 相匹配.
我设法得到了
SELECT * FROM Table1 WHERE string REGEXP '^[A-Za-z]+[-]{1}[A-Za-z]+$'
从上面的示例数据集,我会回来
some-text
my-text
no-text
yes-dash
no-dash
现在,我真正想得到的是第一个查询结果中的任何 string
,如果破折号 -
被删除,那么新字符串会 NOT 存在于 Table
中。
从示例数据集中,以下应该是输出,
some-text
no-text
no-dash
有什么想法吗?
最佳答案
一旦你有了这些行,你就可以使用传统的 SQL 来查找没有非破折号等价物的行:
SELECT a.*
FROM Table1 a
LEFT JOIN Table1 b
ON b.string = REPLACE(a.string, '-', '')
WHERE a.string REGEXP '^[A-Za-z]+-[A-Za-z]+$'
AND b.string IS NULL
另请注意正则表达式的简化,因为 [-]
与普通 -
相同,而 {1}
是多余的(所有术语都有一个隐式量词 1)。
如果您不熟悉这个用于查找不匹配项的惯用语,它是有效的,因为左连接总是返回一行,但是当没有匹配的行时所有列都是 NULL
,并且 where 子句(在连接完成后 触发)仅过滤那些行。此外,您不必担心重复,因为在没有匹配的联接时只会返回 1 行。
关于MySQL REGEXP 匹配带破折号的字符串,匹配没有破折号的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41598778/