我正在学习SQL(没有具体实现)。
我需要使用 Like 或 NOT LIKE
验证某些值仅包含字符1 。错误的示例是:
SELECT * FROM table WHERE name LIKE '%[a-zA-Z]'
因为' 123A123 '将是 true
2 。我读到它将起作用
SELECT * FROM table WHERE name NOT LIKE '%[^a-zA-Z]%'
这些查询看起来和我一样(就像比较5和-5)
请您解释一下有什么区别吗?
答案 0 :(得分:1)
此表达式:
WHERE name NOT LIKE '%[^a-zA-Z]%'
匹配所有具有非字母字符的名称,例如.
或;
等。
此表达式:
name LIKE '%[a-zA-Z]'
匹配包含至少一个字母的所有名称。
因此,'ABC.DEF'
将匹配这两种模式-它匹配第一个,因为它具有.
,第二个因为它具有字母。
但是,'ABC'
与第一个模式不匹配,因为它仅由字母组成。它确实与第二个匹配。
答案 1 :(得分:1)
好吧,让我们对此进行剖析:
NOT LIKE '%[^a-zA-Z]%'
此处的正则表达式为“不包含任何字母”。如果我们使用NOT LIKE
取反,则表示“仅包含字母”。
现在:
name LIKE '%[A-Za-z]%'
这里的Regexp表示“包含至少一个字母”。因此,LIKE
的含义相同。
所以:
SELECT * FROM (VALUES ('A123'), ('123'), ('AAA'), (',')) x(name)
WHERE name LIKE'%[A-Za-z]%'
这将同时返回A123
(有一个A)和AAA
,但不会返回123
(仅数字)和,
(仍不是字母)
SELECT * FROM (VALUES ('A123'), ('123'), ('AAA'), (',')) x(name)
WHERE name NOT LIKE '%[^A-Za-z]%'
该字母将仅返回AAA
,因为它是唯一仅包含字母的字母。 AAA
是唯一不符合regexp的记录,并且由于我们与NOT LIKE
否定,这意味着只有这一个符合WHERE
条件。