powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / почему так ?
25 сообщений из 77, страница 2 из 4
почему так ?
    #39520644
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envА для каких целей Вы используете all в рамках своих задач?по идее, ему грамотнее было бы задействовать NOT EXISTS в данном случае.
ошибаюсь?
...
Рейтинг: 0 / 0
почему так ?
    #39520651
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopПредставь, что ты пишешь функцию, котора принимает на вход
* атомарное значение
* массив
* оператор
Она возвращает false, если оператор возвращает false хотя бы для одного элемента массива, иначе true.
Какова будет твоя логика если массив пустой?Представь, что ты пишешь функцию, которая возвращает длину строки в символах. Какова будет твоя логика, если строка пустая?
...
Рейтинг: 0 / 0
почему так ?
    #39520652
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньевкак надо бы писать, на месте индусов из OracleВо время реализации этой логики Индия ещё была отсталой страной.
...
Рейтинг: 0 / 0
почему так ?
    #39520653
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKaddbms_photoshopПредставь, что ты пишешь функцию, котора принимает на вход
* атомарное значение
* массив
* оператор
Она возвращает false, если оператор возвращает false хотя бы для одного элемента массива, иначе true.
Какова будет твоя логика если массив пустой?Представь, что ты пишешь функцию, которая возвращает длину строки в символах. Какова будет твоя логика, если строка пустая?

Неудачный пример, в нем нет множества. А речь именно о нем.
...
Рейтинг: 0 / 0
почему так ?
    #39520655
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopЭто троллинг?
Оператор сравнения атомарных значений (одно из которых null) и поэлементное сравнение с элементами множества (которое в конкретном случае пустое).

Пока я вижу только твою ничем не подтвержденную интерпретацию. Все что ecть в документации это "Compares a value to every value in a list or returned by a query". Ну да ладно. Примем твою интерпретацию. X= ALL (subquery) сравнивает поэлементно. Ну а что тогда делает X= (subquery)? Чем это отличается от X= ALL (subquery) кроме как в первом случае возвращаемое множество ограничено одним элементом?

SY.
...
Рейтинг: 0 / 0
почему так ?
    #39520658
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLerНеудачный пример, в нем нет множества. А речь именно о нем.AmKadпропущено...
Представь, что ты пишешь функцию, которая возвращает длину строки в символах количество элементов коллекции (aka CARDINALIRY() ). Какова будет твоя логика, если строка коллекция пустая?
...
Рейтинг: 0 / 0
почему так ?
    #39520659
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

Если посмотреть, как строится план, то оптимизатор смотрит по логике "не существует ни одного элемента в множестве, значение которого не совпадает с указанным элементом".

Т.е. для такого запроса -filter : not exists (... where null is not null)
...
Рейтинг: 0 / 0
почему так ?
    #39520661
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю все сводится к тому что ALL/ANY/SOME попaли в Oracle через жeлание Oracle соответствовать SQL стандартам и Oracle с нетрадиционной ориентацией на NULL пришлось приспосабливаться.

SY.
...
Рейтинг: 0 / 0
почему так ?
    #39520662
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYdbms_photoshopЭто троллинг?
Оператор сравнения атомарных значений (одно из которых null) и поэлементное сравнение с элементами множества (которое в конкретном случае пустое).

Пока я вижу только твою ничем не подтвержденную интерпретацию. Все что ecть в документации это "Compares a value to every value in a list or returned by a query". Ну да ладно. Примем твою интерпретацию. X= ALL (subquery) сравнивает поэлементно. Ну а что тогда делает X= (subquery)? Чем это отличается от X= ALL (subquery) кроме как в первом случае возвращаемое множество ограничено одним элементом?

SY.
Код: plaintext
скаляр = скаляр
выполняет сравнение двух атомарных значений
Код: plaintext
скаляр = any множество
выполняет проход по множеству до нахождение первого true (изначальное состояние false)
Код: plaintext
скаляр = all множество
выполняет проход по множеству до нахождения первого false (изначальное состояние true)
...
Рейтинг: 0 / 0
почему так ?
    #39520666
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKaddbms_photoshopПредставь, что ты пишешь функцию, котора принимает на вход
* атомарное значение
* массив
* оператор
Она возвращает false, если оператор возвращает false хотя бы для одного элемента массива, иначе true.
Какова будет твоя логика если массив пустой?Представь, что ты пишешь функцию, которая возвращает длину строки в символах. Какова будет твоя логика, если строка пустая?Если мы затронули пустые строки, то воспользуясь случаем замечу, что Оракловая реализация отстой.
Вот результат для Impala и он представляется мне абсолютно логичным.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
> select id, length(id) l from (select '1' id union all select '' id union all select null id) t;
+------+------+
| id   | l    |
+------+------+
| 1    | 1    |
|      | 0    |
| NULL | NULL |
+------+------+
...
Рейтинг: 0 / 0
почему так ?
    #39520668
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopпредставляется мне абсолютно логичнымнеееее
а как же прививание с пеленок идеи тождественности пустой строки и NULL?
...
Рейтинг: 0 / 0
почему так ?
    #39520669
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--Представь, что ты пишешь функцию, которая возвращает длину строки в символах количество элементов коллекции (aka CARDINALIRY() ). Какова будет твоя логика, если строка коллекция пустая?[/quot]
опять мимо
...
Рейтинг: 0 / 0
почему так ?
    #39520670
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--Представь, что ты пишешь функцию, которая возвращает длину строки в символах количество элементов коллекции (aka CARDINALIRY() ). Какова будет твоя логика, если строка коллекция пустая?Согласно доке ожидал null, но не тут-то было. Видимо я не знаю, что такое empty table.
http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions022.htm#SQLRF06305 If the nested table is empty, or is a null collection, then CARDINALITY returns NULL
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create or replace type t_number_table is table of number;
/

Тип создан.


select cardinality(cast(collect(1) as t_number_table)) c1, cardinality(cast(null as t_number_table)) c2
from dual
where 1=0;

        C1         C2
---------- ----------
         0
...
Рейтинг: 0 / 0
почему так ?
    #39520671
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopЕсли мы затронули пустые строки, то воспользуясь случаем замечу, что Оракловая реализация отстой.Здесь я могу с тобой согласиться. Но поведение = all при no rows returned я считаю нелогичным. Можете кидать в меня камнями.
...
Рейтинг: 0 / 0
почему так ?
    #39520672
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SQL> select cardinality(cast(collect(1) as t_number_table)) c1,
  2         cardinality(cast(null as t_number_table)) c2,
  3         cardinality(t_number_table()) c3
  4  from dual;

        C1         C2         C3
---------- ---------- ----------
         1                     0


Так что не устраивает?
...
Рейтинг: 0 / 0
почему так ?
    #39520674
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop
Код: plsql
1.
  3         cardinality(t_number_table()) c3


Это empty table?
...
Рейтинг: 0 / 0
почему так ?
    #39520675
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopТак что не устраивает?расхождение с докой:докаIf the nested table is empty , or is a null collection, then CARDINALITY returns NULL не?
...
Рейтинг: 0 / 0
почему так ?
    #39520678
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadЭто empty table? IS EMPTY
...
Рейтинг: 0 / 0
почему так ?
    #39520683
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene-- IS EMPTY Ну вот:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select
case when c1 is empty then 'c1 is empty' else 'c1 is not empty' end c1, cardinality(c1) card1,
case when c2 is empty then 'c2 is empty' else 'c2 is not empty' end c2, cardinality(c2) card2,
case when c3 is empty then 'c3 is empty' else 'c3 is not empty' end c3, cardinality(c3) card3
from
(select cast(collect(1) as t_number_table) c1, cast(null as t_number_table) c2, t_number_table() c3
  from dual
  where 1=0
);

C1                   CARD1 C2                   CARD2 C3                   CARD3
--------------- ---------- --------------- ---------- --------------- ----------
c1 is empty              0 c2 is not empty            c3 is empty              0
...
Рейтинг: 0 / 0
почему так ?
    #39520686
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--dbms_photoshopТак что не устраивает?расхождение с докой:докаIf the nested table is empty , or is a null collection, then CARDINALITY returns NULL не?Да, тут по видимому две проблемы.
Во первых расхождение с докой, а во-вторых криво работает.

Логично, если EMPTY - 0, null collection - null.

Но для первой коллекции я ожидал 1 в результате.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQL> select
  2  cardinality(c1) cc1,
  3  case when c1 is empty then 'EMPTY' end e1,
  4  cardinality(c2) cc2,
  5  case when c2 is empty then 'EMPTY' end e2,
  6  cardinality(c3) cc3,
  7  case when c3 is empty then 'EMPTY' end e3,
  8  cardinality(c4) cc4,
  9  case when c4 is empty then 'EMPTY' end e4
 10  from
 11  (select cast(collect(cast(null as number)) as t_number_table) c1,
 12          cast(null as t_number_table) c2,
 13          t_number_table() c3,
 14          t_number_table(null) c4
 15  from dual) t;

       CC1 E1           CC2 E2           CC3 E3           CC4 E4
---------- ----- ---------- ----- ---------- ----- ---------- -----
         0 EMPTY                           0 EMPTY          1
...
Рейтинг: 0 / 0
почему так ?
    #39520689
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--,

Подлец ты все-таки, увел обсуждение от all к cardinality.
...
Рейтинг: 0 / 0
почему так ?
    #39520696
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

И почему-же у ANY изначальное FALSE а у ALL изначальное TRUE? Круг замкнулся. Не говоря о том что это уже implementation так-как для ANY прoще искать одно соответствие (и посему установить изначальное в FALSE) а для ALL одно не соответствие (и посему установить изначальное в TRUE). Вопрос в том что есть результат сравнения скалярa с элементом пустого множества (TRUE/FALSE/UNKNOWN)?

Согласно SQL in Nutshell, 3rd edition by Kevin Kline это заложено в SQL стандарт:



SQL2003 Syntax
SELECT ...
WHERE expression comparison {ALL | ANY | SOME} ( subquery )


Keywords

WHERE expression
Tests a scalar expression (such as a column) against every value in the subquery for ALL, and against every value until a match is found for ANY and SOME. All rows must match the expression to return a Boolean TRUE value for the ALL operator, while one or more rows must match the expression to return a Boolean TRUE value for the ANY and SOME operators.
comparison
Compares the expression to the subquery. The comparison must be a standard comparison operator like =, <>, !=, >, >=, <, or <=.


Rules at a Glance

The ALL operator returns a Boolean TRUE value when one of two things happens: either the subquery returns an empty set (i.e., no records), or every record in the set meets the comparison. ALL returns FALSE when any record in the set does not match the value comparison. The ANY and SOME operators return a Boolean TRUE when at least one record in the subquery matches the comparison operation, and FALSE when no record matches the comparison operation (or when a subquery returns an empty result set). If even one return value of the subquery is NULL, the operation evaluates as NULL, not as TRUE.

SY.
...
Рейтинг: 0 / 0
почему так ?
    #39520697
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopдля первой коллекции я ожидал 1 в результате.что-то ниже спины подсказывает мне, что CARDINALITY не считает NULL..
...
Рейтинг: 0 / 0
почему так ?
    #39520701
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicВо время реализации этой логики Индия ещё была отсталой страной.
Главное, что логика была и есть по сей день.
...
Рейтинг: 0 / 0
почему так ?
    #39520702
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLerНеудачный пример, в нем нет множества. А речь именно о нем.
Как раз есть - упорядоченное. Но пример показывает, что логика ущербна.

А вот требование пустоты задает не так много вариантов ответа.
...
Рейтинг: 0 / 0
25 сообщений из 77, страница 2 из 4
Форумы / Oracle [игнор отключен] [закрыт для гостей] / почему так ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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