Каретка в SQL Server - PullRequest
       16

Каретка в SQL Server

0 голосов
/ 10 ноября 2019

Рассмотрим следующий запрос:

Select  
    Case when left(‘152rew’, 5) not like ‘%[^A-Za-z]%’ 
       then ‘true’ 
       else ‘false’ 
    end 

Как ^ это работает в приведенном выше SQL-выражении, так как возвращает false.

Может кто-нибудь помочь мне с этим?

Ответы [ 3 ]

1 голос
/ 10 ноября 2019

В синтаксисе LIKE , используемом в SQL Server, вы действительно можете использовать класс символов.

Например:

x LIKE '%[A-Z]%'

Что будет верно, если x содержит хотя бы 1 букву.

Кстати, в этом примере предполагается сопоставление без учета регистра.

^ в начале [...] используется как отрицание этого.

Fe

x LIKE '%[^A-Z]%'  

Что было бы верно, если бы x содержал хотя бы один символ, НЕ являющийся буквой.

Итак, при отрицании отрицания:

x NOT LIKE '%[^A-Z]%'  

Это похоже на поиск x, который содержит только буквы, или является пустой строкой. Другими словами: x большинство НЕ содержит символ, который НЕ является буквой.

Но что-то вроде '152rew' также содержит цифры, поэтому оно ложно.

0 голосов
/ 10 ноября 2019

SQL Server допускает классы символов в LIKE. '%[A-Za-z]%' означает «содержит букву». ^ отрицает выражение. '%[^A-Za-z]%' означает «содержит не-букву».

Следовательно, ваше выражение CASE в псевдокоде:

if '152re' doesn't contain a "non-letter"
     then 'true'
     else 'false'
end if

Или проще:

if '152re' contains a "non-letter"
     then 'false'
     else 'true'
end if

1, 5 и 2 не являются буквами, поэтому строка содержит «не-букву»;выражение возвращает «ложь».

0 голосов
/ 10 ноября 2019
Select  Case when left('152rew',5) not like '%[^A-Za-z]%' then 'true' else 'false' end

left('152rew',5) будет 152re, что не соответствует регулярному выражению '%[^A-Za-z]%', потому что:

'%[^A-Za-z]%' будет сопоставляться со словами, которые содержат только буквы (AZ), так какимеет a-z, что делает его нечувствительным к регистру, поэтому он принимает все буквы от A до Z, т. е. заглавные и маленькие.

Поскольку он не соответствует '%[^A-Za-z]%', возвращается true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...