Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 пробел равен пустой строке  [new]
sp_eedo
Member

Откуда: ьщы
Сообщений: 507
Народ, подскажите пожалуйста как сделать чтобы условие не выполнялось.

if  '    '  = '' begin
	print 'x'
end
12 июл 12, 14:27    [12856951]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
sp_eedo
Member

Откуда: ьщы
Сообщений: 507
sp_eedo,
имеется ввиду
слева от равно пробел или 2 пробела
справа пустая строка

if  ' '  = '' begin
	print 'x'
end
12 июл 12, 14:30    [12856991]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
Konst_One
Member

Откуда:
Сообщений: 11540
что за бред?
что конкретно то нужно?
12 июл 12, 14:35    [12857050]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
sp_eedo,
при сравнении пробелы справа игнорируются. приводите к binary или дополнительно сравнивайте datalength() этих строк
12 июл 12, 14:36    [12857062]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
Max_Tpop
Member

Откуда:
Сообщений: 86
sp_eedo,

Как вариант можно использовать ASCII
12 июл 12, 19:13    [12859225]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
if  '' LIKE '    ' begin
	print 'x'
end
12 июл 12, 20:02    [12859318]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
Виталий Гонтовой
Member

Откуда: Харьков
Сообщений: 8
if QUOTENAME(' ') = '' begin
print 'x'
end
13 июл 12, 10:44    [12861448]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Виталий Гонтовой
if QUOTENAME(' ') = '' begin
print 'x'
end
А справа почему QUOTENAME нет?
13 июл 12, 10:49    [12861482]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
Виталий Гонтовой
Member

Откуда: Харьков
Сообщений: 8
да. недописал.
13 июл 12, 11:04    [12861616]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
для тупых
Guest
iap
if  '' LIKE '    ' begin
	print 'x'
end

а почему ('' LIKE ' ') = false, a (' ' LIKE '') = true?
13 июл 12, 11:25    [12861781]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
для тупых
а почему ('' LIKE ' ') = false, a (' ' LIKE '') = true?
Потому что LIKE не коммутативный оператор.
13 июл 12, 11:41    [12861912]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
invm
LIKE не коммутативный оператор
IN кстати тоже
Здравствуйте коллега.

для тупых, по определению:
<строка поиска> LIKE <шаблон поиска>
Если шаблон поиска присутствует то True, иначе False.

В пустой строке нет пробелов, пустая строка есть в любой (не нулевой) строке.
Кстати понятие NULL в чистом ввиде здесь обламывается.

KO
13 июл 12, 12:06    [12862116]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
Mnior, ну вот взяли и все разжевали, не оставили человеку возможности почитать про куммутативность и подумать.
13 июл 12, 12:16    [12862187]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
для тупых
Guest
не, тупые в курсе про коммутативность, у них даже 5 по алгебре.
тупые юзали LIKE неск. лет, но только сегодня поняли, что думали наоборот о том, что во что включается.
т.е, меня вдруг переклинило вот так: 'абракадабра' like 'а%'? да.
кто куда включен? 'абракадабра' включена во множество, определяемое шаблоном 'а%'.
и таки да, пустая строка включена в любую, ну так значит должно быть наоборот: '' like ' '
проверяю. как бы не так. срабатывает обратное, как написал iap.
вот тут и начался маразм.
13 июл 12, 12:25    [12862264]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
для тупых,

слева - где ищем
справа - что ищем
'' like ' ' (в пустой строке ищем пробел) не должно срабатывать, а ' ' like '' - должно
13 июл 12, 12:28    [12862289]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
для тупых
не, тупые в курсе про коммутативность, у них даже 5 по алгебре.
тупые юзали LIKE неск. лет, но только сегодня поняли, что думали наоборот о том, что во что включается.
т.е, меня вдруг переклинило вот так: 'абракадабра' like 'а%'? да.
кто куда включен? 'абракадабра' включена во множество, определяемое шаблоном 'а%'.
и таки да, пустая строка включена в любую, ну так значит должно быть наоборот: '' like ' '
проверяю. как бы не так. срабатывает обратное, как написал iap.
вот тут и начался маразм.
Если хвостовые пробелы в шаблоне LIKE, то они никуда не деваются при сравнении.
А перед сравнением оператором "=" - отбрасываются.
Причём с этим бесполезно бороться. Уже столько тем про это на форуме было...

Как мило шутит Microsoft, "By design"!
13 июл 12, 12:33    [12862314]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
для тупых
Guest
Shakill,

вот да, в терминологии кого и где ищем мне понятно. а со включением переклинило.
спасибо разъясняющим для тупых!

iap,
про сравнение с отбрасыванием - это же одни из первых грабель, невозможно не наступить,
про like с пробелами даже никогда в голову не приходило, т.к. правильно работает.
убило именно осмысление LIKE на этом примере
13 июл 12, 12:41    [12862356]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> В пустой строке нет пробелов, пустая строка есть в любой (не нулевой) строке.

ненене!
поиск пустой строки в строке - это шаблон '%%', а не ''.
а то, что для varchar не учитываются концевые
пробелы в строке, для которой проверяется шаблон, это
надо просто запомнить.

для Nvarchar, кстати, учитываются.

if N'   ' like N''
   print '!'

Posted via ActualForum NNTP Server 1.5

13 июл 12, 12:58    [12862505]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
daw
для Nvarchar, кстати, учитываются.

ничего себе. итого имеем:
if '   '  like ''  print '1'    -- да  
if '   '  = ''     print '2'    -- да
if N'   ' like N'' print '3'    -- нет
if N'   ' = N''    print '4'    -- да

не могу сформулировать принцип действия :(
13 июл 12, 13:07    [12862586]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
iap
Как мило шутит Microsoft, "By design"!

Ха, у МС хотябы пустая строка не эквивалента NULL, в отличии от некоторых, не будем показывать пальцем, субд
13 июл 12, 13:09    [12862603]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
Shakill
daw
для Nvarchar, кстати, учитываются.

ничего себе. итого имеем:
if '   '  like ''  print '1'    -- да  
if '   '  = ''     print '2'    -- да
if N'   ' like N'' print '3'    -- нет
if N'   ' = N''    print '4'    -- да

не могу сформулировать принцип действия :(

неявное преобразование чтоли....
но вообще-то нварчар работает так же как и варчар

declare @v1 nvarchar(5), @v2 nvarchar(5)
select @v1 = N'   ', @v2 = N''

if @v1 = @v2 print '1'    -- да  

declare @v3 varchar(5), @v4 varchar(5)
select @v3 = '   ', @v4 = ''

if @v3 = @v4 print '2'    -- да  
13 июл 12, 13:14    [12862653]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
ошибся, этож лайки а не =.... да хм.... фича !!
13 июл 12, 13:16    [12862675]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
CSV_NULL
Guest
Ivan Durak
iap
Как мило шутит Microsoft, "By design"!

Ха, у МС хотябы пустая строка не эквивалента NULL, в отличии от некоторых, не будем показывать пальцем, субд

зато если результаты запроса сохранять как csv,
NULL записывается не пустым местом, а строкой 'NULL'.
очень мило, когда нарываешься в первый раз.
13 июл 12, 13:19    [12862702]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> не могу сформулировать принцип действия :(

для сравнения с помощью = концевые пробелы не учитываются никогда.
в BOL можно найти здесь
http://msdn.microsoft.com/en-us/library/ms191529(v=sql.105).aspx
BOL
Trailing blanks are ignored in comparisons; for example, these are equivalent:

но, собственно, это и требование стандарта (сформулировано несколько иначе, но результат тот же):
<comparison predicate>

If the length in characters of X is not equal to the length in characters of Y, then the shorter string is
effectively replaced, for the purposes of comparison, with a copy of itself that has been extended to
the length of the longer string by concatenation on the right of one or more pad characters, where the
pad character is chosen based on CS. If CS has the NO PAD characteristic, then the pad character is
an implementation-dependent character different from any character in the character set of X and Y
that collates less than any string under CS. Otherwise, the pad character is a <space>.


для like расписано в статье про like.
http://msdn.microsoft.com/en-us/library/ms179859.aspx
BOL
When you perform string comparisons by using LIKE, all characters in the pattern string are significant. This includes
leading or trailing spaces. If a comparison in a query is to return all rows with a string LIKE 'abc ' (abc followed by
a single space), a row in which the value of that column is abc (abc without a space) is not returned. However, trailing
blanks, in the expression to which the pattern is matched, are ignored. If a comparison in a query is to return all rows
with the string LIKE 'abc' (abc without a space), all rows that start with abc and have zero or more trailing blanks are
returned.

....

LIKE supports ASCII pattern matching and Unicode pattern matching. When all arguments (match_expression, pattern, and
escape_character, if present) are ASCII character data types, ASCII pattern matching is performed. If any one of the
arguments are of Unicode data type, all arguments are converted to Unicode and Unicode pattern matching is performed.
When you use Unicode data (nchar or nvarchar data types) with LIKE, trailing blanks are significant; however, for
non-Unicode data, trailing blanks are not significant. Unicode LIKE is compatible with the ISO standard. ASCII LIKE is
compatible with earlier versions of SQL Server.


Posted via ActualForum NNTP Server 1.5

13 июл 12, 13:36    [12862863]     Ответить | Цитировать Сообщить модератору
 Re: пробел равен пустой строке  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
daw
When you use Unicode data (nchar or nvarchar data types) with LIKE, trailing blanks are significant; however, for
non-Unicode data, trailing blanks are not significant. Unicode LIKE is compatible with the ISO standard. ASCII LIKE is
compatible with earlier versions of SQL Server.


вот этот абзац не заметил, его и достаточно. просто придется запомнить
13 июл 12, 13:43    [12862906]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить