假设我在MySQL数据库中有一个表Table1
表。该表有一个名为string
的列。这是一个例子:
**Table1**
mytext
my-text
some-text
no-text
notext
yes-dash
yesdash
no-dash
我希望获得string
的{{1}}行,其匹配的REGEXP仅匹配字母字符和单个短划线(Table1
)。
我设法用
来实现-
从上面的示例数据集中,我将回来
SELECT * FROM Table1 WHERE string REGEXP '^[A-Za-z]+[-]{1}[A-Za-z]+$'
现在,我真正希望获得的是第一个查询结果中的任何some-text
my-text
no-text
yes-dash
no-dash
,如果删除了短划线string
,那么新字符串会不存在于-
中。
从示例数据集中,以下内容应为输出
Table
有什么想法吗?
答案 0 :(得分:1)
这似乎很好奇。但这是一种方法:
select t1.*
from table1 t1
where not exists (select 1
from table1 tt1
where tt1.string REGEXP '^[A-Za-z]+[-]{1}[A-Za-z]+$' and
t1.string = replace(tt1.string, '-', '')
);
编辑:
我认为以上是逆(返回未连字的版本)。这很容易解决:
select t1.*
from table1 t1
where t1.string REGEXP '^[A-Za-z]+[-]{1}[A-Za-z]+$' and
not exists (select 1
from table1 tt1
where tt1.string = replace(t1.string, '-', '') and
tt1.string not like '%-%'
);
答案 1 :(得分:1)
获得行后,可以使用常规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}
是多余的(所有术语都有一个隐式量词)。
如果你不熟悉这个用于查找不匹配的习惯用法,那么它的工作原理是因为左连接总是返回一行,但是当没有匹配的行时所有列都是NULL
,而where子句(它会触发) 在之后进行连接)仅过滤那些行。此外,您不必担心重复,因为没有匹配的连接时只返回1行。