SQL-不喜欢和只包含字符

时间:2019-04-09 00:32:58

标签: sql sql-server

我正在学习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)

请您解释一下有什么区别吗?

2 个答案:

答案 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条件。