Вниз
Скачать: CL | DM;

Отождествление пустой строки и NULL   Найти похожие ветки 

← →
Игорь Шевченко ©   (2008-07-01 16:20) [40]

Если пример [23] дополнить:

я@ora10> create unique index yyy on xxx(a);

Index created.

я@ora10> select * from xxx order by a;

        A
----------
        1
        2
        3
        4

я@ora10> insert into xxx values(NULL);

1 row created.

я@ora10> select * from xxx order by a;

        A
----------
        1
        2
        3
        4

6 rows selected.

Execution Plan
----------------------------------------------------------
Plan hash value: 4016984797

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     6 |    78 |     4  (25)| 00:00:01 |
|   1 |  SORT ORDER BY     |      |     6 |    78 |     4  (25)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| XXX  |     6 |    78 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------


Видно, что индекс игнорируется, потому что есть значения NULL, а запрошены все записи.

но:

я@ora10>select * from xxx where a is not null order by a

        A
----------
        1
        2
        3
        4

Execution Plan
----------------------------------------------------------
Plan hash value: 2441963755

-------------------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     4 |    52 |     1   (0)| 00:00:01 |
|*  1 |  INDEX FULL SCAN | YYY  |     4 |    52 |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------


← →
pasha_golub ©   (2008-07-01 16:21) [41]


> atruhin1   (01.07.08 16:15) [36]


> а про IBX для Interbase/Firebird ты не прав, в IB/FB  и
> соответственно,
> в компонентах это абсолютно разные вещи.

Прошу прощения. Я сам не проверял. Все со слов пользователя.


← →
pasha_golub ©   (2008-07-01 16:25) [42]

А еще один довод от пользователя.

CREATE TABLE ..(
somecol char(1) CHECK somecol in ("M", "W")
)

И соответственно в таком виде NULL позволяется, а пользователь не может его вставить через грид или другой какой контрол.


← →
Игорь Шевченко ©   (2008-07-01 16:26) [43]


> И соответственно в таком виде NULL позволяется


не позволяется. Он вызывает нарушение ограничения :)


← →
McSimm ©   (2008-07-01 16:28) [44]

Всякое бывает.
Другой какой-нибудь контрол обработает, к примеру, Ctrl-Del и отобразит [NULL]


← →
Ega23 ©   (2008-07-01 16:30) [45]

somecol char(1) CHECK somecol in ("M", "W")

А где "Ребёнок" и "Домашнее жЫвотное"? :)


← →
pasha_golub ©   (2008-07-01 16:31) [46]


> Игорь Шевченко ©   (01.07.08 16:26) [43]


>
> не позволяется. Он вызывает нарушение ограничения :)

Не знаю как в Оракле, но в Постгресе не вызовет


← →
pasha_golub ©   (2008-07-01 16:32) [47]


> McSimm ©   (01.07.08 16:28) [44]


> Другой какой-нибудь контрол обработает, к примеру, Ctrl-
> Del и отобразит [NULL]

И ведь не поспоришь.


> Ega23 ©   (01.07.08 16:30) [45]


> А где "Ребёнок" и "Домашнее жЫвотное"? :)

Не догадалсо. :) я обычно пишу M\F (male\female), однако есть еще люди которым ближе man\woman :)


← →
pasha_golub ©   (2008-07-01 16:34) [48]

Кстати, по поводу приведенного примера я чего еще задумался. Ведь char(1) должен состоять из одного символа и точка. Это ведь не varchar(1). То есть в таком случае было бы может и логично пустую строку возводить в статус NULL, однако в случае varchar религия имеет место быть.


← →
Игорь Шевченко ©   (2008-07-01 16:37) [49]


> я обычно пишу M\F (male\female),


sometimes camel


> Это ведь не varchar(1).


varchar(1) тоже состоит из одного символа и точка. Из половины символа он состоять не может. В оракле так они даже хранятся одинаково char(1) и varchar(1)


← →
Anatoly Podgoretsky ©   (2008-07-01 16:37) [50]

> pasha_golub  (01.07.2008 15:07:00)  [0]

TDataset говоришь?
Так ничего не выйдет, пустая строка равна nil и никакой структуры строки. Не возможно представить строку по другому как пустое в Дельфи. В базе может и можно.


← →
Anatoly Podgoretsky ©   (2008-07-01 16:39) [51]

> pasha_golub  (01.07.2008 15:18:04)  [4]

А где тут TDataset?
При том это всего лишь особенность получается при присвоение значения и обратно никак, только если специально присвоить NULL.

А этим NULL <> NULL ты что хотел сказать?


← →
Anatoly Podgoretsky ©   (2008-07-01 16:40) [52]

> Ega23  (01.07.2008 15:20:06)  [6]

В вопросе на клиенте, и при том для типа string
А дальше пошел какой то разброд, уже далекий от вопроса.


← →
Anatoly Podgoretsky ©   (2008-07-01 16:41) [53]

> Ega23  (01.07.2008 15:32:08)  [8]

> ftString - то при Null-значении показывать ""

А это как, хочешь Дельфи переписать?


← →
Ega23 ©   (2008-07-01 16:41) [54]


> sometimes camel
>


упалпацтул!!!
КЛАСС!!!!   :)))))))))))))


← →
Anatoly Podgoretsky ©   (2008-07-01 16:43) [55]

> pasha_golub  (01.07.2008 15:07:00)  [0]

Кстати ты собираешься ограничиться только этими серверами? И где в них там TDataset


← →
Anatoly Podgoretsky ©   (2008-07-01 16:45) [56]

> Ega23  (01.07.2008 15:44:16)  [16]

Так не все же архитекторы грамотные.
Кстати как насчет минуса? Тоже не так одназначно.


← →
Anatoly Podgoretsky ©   (2008-07-01 16:46) [57]

> Ega23  (01.07.2008 15:47:19)  [19]

Ага значит все таки о конкретных серверах будем говорить, тогда посмотри ANSII настройки. В частности SET NULLS в БОЛ


← →
Anatoly Podgoretsky ©   (2008-07-01 16:49) [58]

> Игорь Шевченко  (01.07.2008 15:48:21)  [21]

Разные вещи, NULL соответствует определению ANSI если только поведение не изменено для ANSI настроек, пошли кое где на поводу старого матобоеспечения (FoxPro например, а это у них основной носитель для импорта/экспорта).

Про Oracle молчим, Oracle и стандарты, это рок против наркотиков.


← →
Anatoly Podgoretsky ©   (2008-07-01 16:51) [59]

> Игорь Шевченко  (01.07.2008 16:01:28)  [28]

Твое предположение верно, может тебе попадались обсуждения с разработчиками по этому поводу.


← →
Anatoly Podgoretsky ©   (2008-07-01 16:52) [60]

> pasha_golub  (01.07.2008 16:08:29)  [29]

Видишь ли МС не кладет, а позволяет управлять этим, а насколько я помню Оракл именно кладет. При том вроде и не последовательны.


← →
Anatoly Podgoretsky ©   (2008-07-01 16:54) [61]

> McSimm  (01.07.2008 16:09:31)  [31]

Пустым ты что в данном случае считаешь, если "" то по стандарту одну можно. А если NULL то по стандарту ни одно, поскольку NULL это не определено, то оно и не может представлять собой конкретную строку, а вот пустая строка может.


← →
Anatoly Podgoretsky ©   (2008-07-01 16:55) [62]

> Игорь Шевченко  (01.07.2008 16:13:33)  [33]

> Оракл появился немного раньше стандартов.

И вырос в такого монстра, что плевал на всех, он сам себе стандарт.


← →
Anatoly Podgoretsky ©   (2008-07-01 16:57) [63]

> atruhin1  (01.07.2008 16:15:36)  [36]

> Иногда удобно, иногда нет.

Вот это не должно быть основанием, поскольку результаты не гарантируются, не пройдет даже тестов.


← →
McSimm ©   (2008-07-01 16:58) [64]


> Пустым ты что в данном случае считаешь, если "" то по стандарту
> одну можно. А если NULL то по стандарту ни одно, поскольку
> NULL это не определено

Так вопрос про Оракл был, где "" и NULL суть одно.

Насчет стандарта - не совсем понял. Unique key, насколько я с ними сталкивался, позволяет хранить NULL в любом количестве.


← →
Ega23 ©   (2008-07-01 17:01) [65]


> Unique key, насколько я с ними сталкивался, позволяет хранить
> NULL в любом количестве.


Короче, была какая-то фигня с Null. То ли с FTS, то ли с индексом...
В смысле, что только одно значение null в столбце на всю таблицу.


← →
Игорь Шевченко ©   (2008-07-01 17:23) [66]

Anatoly Podgoretsky ©   (01.07.08 16:55) [62]


> И вырос в такого монстра, что плевал на всех, он сам себе
> стандарт.


Насколько мне известно, стандарту целиком и полностью не соответствует ни одна СУБД. У каждой есть свои расширения, отходящие от стандарта.

Кстати, сам Оракл пишет в документации:

"Oracle Database currently treats a character value with a length of zero as null. However, this may not continue to be true in future releases, and Oracle recommends that you do not treat empty strings the same as nulls."


← →
Поросенок Винни-Пух ©   (2008-07-01 17:37) [67]

то оно и не может представлять собой конкретную строку, а вот пустая строка может.

Если пустая строка может представлять конкретную строку ("равноправное" значение строкового типа), то тогда было бы возможно определить сколько именно таких значений содержится в этом посте.
А этого никто определить не сможет.


← →
McSimm ©   (2008-07-01 17:44) [68]


> сколько именно таких значений содержится в этом посте.

Я могу это определить.
Этот пост представляет собой запись из нескольких полей (некоторые отображаются, некоторые нет). Из отображаемых - одно поле представляет собой пустую строку.

А дробить одно поле - некорректно. Или придется считать количество нулей в числе 17.


← →
Поросенок Винни-Пух ©   (2008-07-01 17:48) [69]

Я могу это определить.

Допустим.
Определил, что из там 10.
А я утверждаю что изх там 1000.
Как определить кто прав?


← →
McSimm ©   (2008-07-01 17:53) [70]


> Как определить кто прав?

гм... я даже теряюсь... при таком подходе остается только назначить незаинтересованных арбитров и спросить кому они больше верят :)

Я даже могу предоставить саму запись на рассмотрение (хотя ее и так видно)
name: "Поросенок Винни-Пух",
email: "",
ip: "**.***.**.***"

и т.д.


← →
McSimm ©   (2008-07-01 17:58) [71]

есть еще вариант, спросить у perl

# smth like this
foreach (keys %fields) {
 $count++ if ($REC{$_} eq "");
}


← →
Поросенок Винни-Пух ©   (2008-07-01 18:02) [72]

ну зачем же отмахиваться от простого вопроса?
есть два строковых литерала, один пустой;
я с помошью нескольких конкатенаций делаю из них итоговую строку.
вопрос: определить по итоговой строке сколько раз я в нее вставил пустой литерал.


← →
pasha_golub ©   (2008-07-01 18:07) [73]


> Поросенок Винни-Пух ©   (01.07.08 17:37) [67]


> Если пустая строка может представлять конкретную строку
> ("равноправное" значение строкового типа), то тогда было
> бы возможно определить сколько именно таких значений содержится
> в этом посте.

Нелогично размышляете. Я уже писал что пустая строка есть инвариант по отношению к операции конкатенации. Можно провести паралели с каноническим разложением числа на множители (сорри если коряво звучит, учил на украинском), коее имеет вид a = p1^n1*p2^n2...*pk^nk*E, где pi - простые числа неравные 1.


← →
McSimm ©   (2008-07-01 18:08) [74]


> ну зачем же отмахиваться от простого вопроса?
> есть два строковых литерала, один пустой;
> я с помошью нескольких конкатенаций делаю из них итоговую
> строку.
> вопрос: определить по итоговой строке сколько раз я в нее
> вставил пустой литерал.

Я уже писал про количество нулей в числе 17.


← →
pasha_golub ©   (2008-07-01 18:09) [75]


> Поросенок Винни-Пух ©   (01.07.08 18:02) [72]


> есть два строковых литерала, один пустой;
> я с помошью нескольких конкатенаций делаю из них итоговую
> строку.
> вопрос: определить по итоговой строке сколько раз я в нее
> вставил пустой литерал.

Есть два слагаемых, один из них 0. Я с помощью некоторых операций сложения делаю из них сумму.
Вопрос: определить по итоговой сумме сколько раз я прибавил 0


← →
McSimm ©   (2008-07-01 18:09) [76]

Поле содержит одно значение. Можно считать сколько значений содержит запись или выборка. Какой смысл считать количество значений в одном поле ? (то же - в одной переменной) ?


← →
Поросенок Винни-Пух ©   (2008-07-01 18:10) [77]

Я уже писал про количество нулей в числе 17.

не надо путать публику.
было сказано, что пустая строка - это точно такое же значение строкового типа, как и любая другая строка.
Так что это за значение такое, если его нельзя обнаружить и посчитать?


← →
McSimm ©   (2008-07-01 18:13) [78]

И, кстати о конкатенациях, сколько значений "АА" содержится в строке "АААА" - два или три ?


← →
McSimm ©   (2008-07-01 18:14) [79]


> пустая строка - это точно такое же значение строкового типа,
>  как и любая другая строка.

Равно как и 0 мало отличается от любого другого числового значения.


← →
McSimm ©   (2008-07-01 18:14) [80]


> И, кстати о конкатенациях, сколько значений "АА" содержится
> в строке "АААА" - два или три ?

Правильный ответ - ни одного



Страницы: 1 2 3 4 5 6 вся ветка

Скачать: CL | DM;



Память: 0.62 MB
Время: 0.021 c
15-1214155063
Галинка
2008-06-22 21:17
2008.08.24
Asus Eee PC 900


15-1215530569
Галинка
2008-07-08 19:22
2008.08.24
Потоки


15-1215433698
DRG
2008-07-07 16:28
2008.08.24
C# или С++ с чего начать?


15-1215495559
Игорь М.
2008-07-08 09:39
2008.08.24
Максимальное число записей в таблице Access ?


2-1213952414
No_Dead
2008-06-20 13:00
2008.08.24
Как можно составить запрос?




   Наверх