powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Null не сравнивается...
11 сообщений из 11, страница 1 из 1
Null не сравнивается...
    #36058904
userdub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как заставить ASE 15 корректно сравнивать null-значения с нормальными данными?

Код: plaintext
IF @PER1 <> @PER2
- не срабатывает, когда одна из переменных null
...
Рейтинг: 0 / 0
Null не сравнивается...
    #36058970
MAXHATbIu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм, у меня нормально проходит.

Почитать про использование NULL в выражениях можно тут:
http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.blocks/html/blocks/blocks255.htm
...
Рейтинг: 0 / 0
Null не сравнивается...
    #36058998
_makSim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно так:

IF isnull(@PER1,-1) <> isnull(@PER2,-1) -- если переменная числового типа и <> -1
...
Рейтинг: 0 / 0
Null не сравнивается...
    #36059061
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А их нельзя сравнивать напрямую. Если и какая либо версия сервера и пропускает такое, то это побочный эффект и он в следующей версии может измениться да и код станет неперносимым между разными серверами разных производителей.
Как и советовали выше, переменные которые могут содержать null надо проверять только через isnull
...
Рейтинг: 0 / 0
Null не сравнивается...
    #36059100
userdub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это не логично.
Если одна переменная null, а другая не null, то они не равны абсолютно!
Это ясно любому, но ASE не может такого сказать.
Я не знаю где может быть null, а где нет.
Значит мне надо абсолютно при любых сравнениях ставить конструкции isnull()
получается такое излишнее нагромождение...
...
Рейтинг: 0 / 0
Null не сравнивается...
    #36059294
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В SQL троичная лгика а не двоичная. Результат сравнения с null дает null, а не true или false.
Вот здесь популярно описано: http://ru.wikipedia.org/wiki/NULL_(SQL)
и вот здесь почитайте хорошую статью: http://www.citforum.ru/database/articles/nulls/
...
Рейтинг: 0 / 0
Null не сравнивается...
    #36059319
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Логика остается двоичной. Просто результат False для любой операции сравнения.
...
Рейтинг: 0 / 0
Null не сравнивается...
    #36059437
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
userdubКак заставить ASE 15 корректно сравнивать null-значения с нормальными данными?

Код: plaintext
IF @PER1 <> @PER2
- не срабатывает, когда одна из переменных null
А разве так не отработает:
Код: plaintext
IF @PER1 <> @PER2 OR @PER1 IS NULL OR @PER2 IS NULL
?
...
Рейтинг: 0 / 0
Null не сравнивается...
    #36060503
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golsaЛогика остается двоичной. Просто результат False для любой операции сравнения.Еще раз повторяем: В SQL логика троичная.

Читать тут:
http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.blocks/html/blocks/blocks254.htm
http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.sqlug/html/sqlug/sqlug94.htm
...
Рейтинг: 0 / 0
Null не сравнивается...
    #36073377
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
userdub wrote:
> Автор: userdub
> Как заставить ASE 15 корректно сравнивать null-значения с нормальными
> данными?
>
> IF @PER1 <> @PER2
>
> - не срабатывает, когда одна из переменных null

Так по стандарту и не должен срабатывать,

null <> x != true при любых значениях X, даже если он null.

null == null не есть true

Другое дело, что ASE на это традиционно плевал, но под

set ansinull on

должно именно так и работать.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Null не сравнивается...
    #36073526
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, давно хотел показать такую вещь:

по документации:

ASE 12.5
Parameters

ansinull

determines whether evaluation of NULL-valued operands in aggregate
functions is compliant with the SQL92 standard. If you use set ansinull on,
Adaptive Server generates a warning when an aggregate function eliminates a
null-valued operand from the calculation. This parameter does not affect how
Adaptive Server evaluates NULL values in equality (=) or inequality (!=)
comparisons
.

For example, if you perform the following query on the titles table with
set ansinull off (the default value):

select max(total_sales) from titles

Adaptive Server returns:

-----------
22246

However, if you perform the same query with set ansinull on, Adaptive
Server returns the same value and an error message because the total_sales
column contains NULL values:

-----------
22246
Warning - null value eliminated in set function

This message indicates that some entries in total_sales contain NULL
instead of a real amount, so you do not have complete data on total sales for
all books in this table. However, of the available data, the value returned is
the highest.



Но в 15 уже другое:

ASE 15
ansinull

impacts on both aggregate and comparison behaviors. See “Aggregate
behavior” for more information on aggregate and comparison behaviors.


Хотя выполнение этого скрипта

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
select @@version
go

----------------------------------------------------------------
set ansinull off
select 'ansi null is off'
go

declare @p1 int, @p2 int
select @p1, @p2
select case when @p1 = @p2 then 'true' else 'false' end
go

set ansinull on
select 'ansi null is on'
go

declare @p1 int, @p2 int
select @p1, @p2
select case when @p1 = @p2 then 'true' else 'false' end
go

set ansinull off
go

----------------------------------------------------------------
create table qq ( id numeric( 5 ) identity, f1 int null )
go

insert into qq (f1) values (  1  )
insert into qq (f1) values (  2  )
insert into qq (f1) values ( null )
go
select * from qq
go

set ansinull off
select 'ansi null is off'
go


declare @p1 int
select * from qq where f1 = @p1
go

set ansinull on
select 'ansi null is on'
go

declare @p1 int
select * from qq where f1 = @p1
go

drop table qq
go

set ansinull off
go


на серверах двух этих версий даёт одинаковый результат (кроме конечно самой версии).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
select @@version
go

----------------------------------------------------------------
set ansinull off
select 'ansi null is off'
go

declare @p1 int, @p2 int
select @p1, @p2
select case when @p1 = @p2 then 'true' else 'false' end
go

set ansinull on
select 'ansi null is on'
go

declare @p1 int, @p2 int
select @p1, @p2
select case when @p1 = @p2 then 'true' else 'false' end
go

set ansinull off
go

----------------------------------------------------------------
create table qq ( id numeric(5) identity, f1 int null )
go

insert into qq (f1) values ( 1 )
insert into qq (f1) values ( 2 )
insert into qq (f1) values ( null )
go
select * from qq
go

set ansinull off
select 'ansi null is off'
go


declare @p1 int
select * from qq where f1 = @p1
go

set ansinull on
select 'ansi null is on'
go

declare @p1 int
select * from qq where f1 = @p1
go

drop table qq
go

set ansinull off
go



Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Null не сравнивается...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]