Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 NOT LIKE and NULL  [new]
NetObserver
Member

Откуда:
Сообщений: 642
Столкнулся с загадочным поведением NOT LIKE. Вот тест:
CREATE TABLE [dbo].[LikeTest](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[TextField] [varchar](250) NULL
  CONSTRAINT [PK_LikeTest] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)
) ON [PRIMARY]

GO
INSERT INTO [dbo].[LikeTest]
           ([TextField])VALUES('A')
INSERT INTO [dbo].[LikeTest]
           ([TextField])VALUES('AB')
INSERT INTO [dbo].[LikeTest]
           ([TextField])VALUES('ABC')
INSERT INTO [dbo].[LikeTest]
           ([TextField])VALUES(NULL)
INSERT INTO [dbo].[LikeTest]
           ([TextField])VALUES('E')
INSERT INTO [dbo].[LikeTest]
           ([TextField])VALUES('EF')
           
GO

Теперь попытаемся выбрать все записи, кроме начинающихся с "A".
По идее должно быть 3 записи. Но не тут то было!
SET ANSI_NULLS ON
GO

SELECT TOP 1000 [id]
      ,[TextField]
  FROM [dbo].[LikeTest]
WHERE [TextField] NOT LIKE 'A%'

SET ANSI_NULLS OFF
GO

SELECT TOP 1000 [id]
      ,[TextField]
  FROM [dbo].[LikeTest]
WHERE [TextField] NOT LIKE 'A%'


SET ANSI_NULLS ON
GO

  
SELECT TOP 1000 [id]
      ,[TextField]
  FROM [dbo].[LikeTest]
WHERE NOT ([TextField] LIKE 'A%') 

Как видно - выпадают поля с NULL. Причем ANSI_NULLS никак этим не управляет!
И только явное указание IS NULL дает правильный результат!
SELECT TOP 1000 [id]
      ,[TextField]
  FROM [dbo].[LikeTest]
WHERE [TextField] NOT LIKE 'A%' 
  OR [TextField] IS NULL

Вопрос, это фича или бага!?

ЗЫ Microsoft SQL Server 2008 R2 (SP1) - 10.50.2789.0 (X64)
10 дек 12, 12:24    [13605594]     Ответить | Цитировать Сообщить модератору
 Re: NOT LIKE and NULL  [new]
Гость333
Member

Откуда:
Сообщений: 3683
NetObserver
Причем ANSI_NULLS никак этим не управляет!

Если бы вы открыли документацию по SET ANSI_NULLS, то увидели бы, что
автор
Specifies ISO compliant behavior of the Equals (=) and Not Equal To (<>) comparison operators when they are used with null values.
;-)
10 дек 12, 12:31    [13605657]     Ответить | Цитировать Сообщить модератору
 Re: NOT LIKE and NULL  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
NetObserver,

SET ANSI_NULLS влияет на сравнение с переменными и литералами, принимающими значение NULL, операторами = и <>
Дайте, пожалуйста, ссылку на информацию про поведение LIKE в данном контексте.
10 дек 12, 12:31    [13605664]     Ответить | Цитировать Сообщить модератору
 Re: NOT LIKE and NULL  [new]
NetObserver
Member

Откуда:
Сообщений: 642
iap
NetObserver,

SET ANSI_NULLS влияет на сравнение с переменными и литералами, принимающими значение NULL, операторами = и <>
Дайте, пожалуйста, ссылку на информацию про поведение LIKE в данном контексте.

Да я бы тоже не отказался почитать
Как найдете - выложите

Пока есть только это:
http://msdn.microsoft.com/ru-ru/library/ms179859(v=sql.105).aspx
10 дек 12, 13:26    [13606186]     Ответить | Цитировать Сообщить модератору
 Re: NOT LIKE and NULL  [new]
NetObserver
Member

Откуда:
Сообщений: 642
Гость333
Если бы вы открыли документацию по SET ANSI_NULLS, то увидели бы, что
автор
Specifies ISO compliant behavior of the Equals (=) and Not Equal To (<>) comparison operators when they are used with null values.
;-)

Тоесть LIKE это НЕ сравнение?
Наверное господа из Микрософт тоже так думают
10 дек 12, 13:30    [13606229]     Ответить | Цитировать Сообщить модератору
 Re: NOT LIKE and NULL  [new]
Glory
Member

Откуда:
Сообщений: 104760
NetObserver
Да я бы тоже не отказался почитать
Как найдете - выложите

Как было процитировано, SET ANSI_NULLS влияет лишь на два оператора. И оператора LIKE в этом списке нет.
10 дек 12, 13:30    [13606230]     Ответить | Цитировать Сообщить модератору
 Re: NOT LIKE and NULL  [new]
Glory
Member

Откуда:
Сообщений: 104760
NetObserver
Тоесть LIKE это НЕ сравнение?
Наверное господа из Микрософт тоже так думают

Господа из Майкрософт понимают, что есть оператор.
comparison operators переводится как оператор сравнения. А не просто сравнение

Сообщение было отредактировано: 10 дек 12, 13:32
10 дек 12, 13:31    [13606237]     Ответить | Цитировать Сообщить модератору
 Re: NOT LIKE and NULL  [new]
NetObserver
Member

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

То что SET ANSI_NULLS этим не не управляет - это понятно.
Не понятно другое, в выборку
WHERE [TextField] NOT LIKE 'A%'

должны попадать NULL поля или нет?
10 дек 12, 13:38    [13606296]     Ответить | Цитировать Сообщить модератору
 Re: NOT LIKE and NULL  [new]
Glory
Member

Откуда:
Сообщений: 104760
NetObserver
Не понятно другое, в выборку
WHERE [TextField] NOT LIKE 'A%'

должны попадать NULL поля или нет?

Ну так подумайте. Какое значение получится при сравнении поля NULL с порощью оператора LIKE.
Наверное UNKNOWN
10 дек 12, 13:40    [13606323]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить