Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» InterBase и FireBird: вопросы по работе и их решение

Автор: AlexCoRu
Дата сообщения: 27.08.2012 19:58
delover, каким переводчиком (транслятором) для перевода на русский пользуешься?

Добавлено:
поведение null не особенность сервера, а sql.
Автор: salexn1
Дата сообщения: 28.08.2012 10:29
AlexCoRu
Это не переводчик - это диагноз
Автор: ant0ni02004
Дата сообщения: 28.08.2012 14:54
delover

Цитата:
Если null <> null то

null <> null имеет значение null а не true

Цитата:
будет справедливо, что t1.id =?? null вернёт False

t1.id =?? null вернёт NULL

вся фишка в том, что NULL не просто сам по себе, а это логическое значение
равноправное с остальными двумя (TRUE,FALSE)
и втроём они вместо бинарной логики (да/нет) составляют тернарную (да/нет/неизвестно)
Автор: delover
Дата сообщения: 29.08.2012 07:28
ant0ni02004
Тогда постараюсь объяснить проще. У меня в паскале Си и бейсике нет следующей конструкции:

Код: IF (condition) THEN
proc1
ELSE
proc2
UNKNOWN
proc3;
Автор: VABRO
Дата сообщения: 29.08.2012 08:19
Вот можете внятнее писать, если захотите.

NULL -- это не совсем третье логическое значение. Оно особняком держится от TRUE/FALSE (нужно специально изучать, как себя ведёт NULL при разных операциях).
"NULL" следует читать на русском, как "неизвестно". Поэтому сразу же по-житейски становится понятным многое из результатов операций с данными полей, в которых есть значения "NULL":
NULL == NULL? => NULL (неизвестность == неизвестности? => неизвестно)

Сложение и умножение точно так же себя ведёт, объединение строк точно такой же результат даёт. С житейского опыта - да не удобно.
Вот ещё при объединении таблиц, хитрых запросах появляются пустые значения, которые тоже NULL обозначаются, но тут в смысл у них -- "пустое значение/множество", а не "неизвестно".

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

eddoc
Уже ранее писал про статью на сайте firebird: Что такое NULL?
Так приняли!

Но вон же меняют синтаксис и добавляют плюшки (как уже написал AlexPetrovich):
Add support for "some_col = ? or ? IS NULL" conditions

Пишите им, стучитесь, а не переливайте из пустого в порожнее. Сумеете аргументировано показать большие плюсы от своей хотелки -- есть большой шанс, что сделают (раз синтаксис дополняют). Но у меня подозрения, что такое поведение с выражением _where_ поломает совместимость.
Автор: AlexCoRu
Дата сообщения: 29.08.2012 08:25

Цитата:
У меня в паскале Си и бейсике
Но есть тип Variant.

Код: var V: Variant;
if VarIsNull(V) then proc3
else
if V then proc1
else proc2;
Автор: eddoc
Дата сообщения: 29.08.2012 11:48
VABRO

Цитата:
eddoc
Уже ранее писал про статью на сайте firebird: Что такое NULL?
Так приняли!

Во-первых, спорю не я. Во-вторых: именно эту ссылку я и привел спорщикам тут. Читайте форум внимательно, а не по диагонали.
Автор: ant0ni02004
Дата сообщения: 29.08.2012 15:35
delover

Цитата:
Следующее выражение должно быть верно:
"IF (2 <> 3) => (2 > 3) OR (2 < 3)"

вот вы напрасно смешиваете отношение равенства и отношение порядка
если, например, a и b комплексные то говорить о a=b, a<>b можно,
а об a<b или a>b нельзя

a<>b это всего лишь not (a=b), и никакого специального "<>" нету

VABRO

Цитата:
Add support for "some_col = ? or ? IS NULL" conditions

эх, еще сделать бы это как в оракле, где оптимизатор разбирается что к чему сам и выкидывает ненужные части where
Автор: VABRO
Дата сообщения: 29.08.2012 19:01
eddoc
Прошу меня извинить. Да, виноват, сделал оплошность, как и delover: неправильно выразил свои мысли и плюс без указания в самом начале своего сообщения, кому адресую.
я адресовал _всё_ своё сообщение к delover.
В куске:

Цитата:
eddoc
Уже ранее писал про статью на сайте firebird: Что такое NULL?
Так приняли!

Неверно оформил свои мысли в предложении.
Я хотел там высказать, что Вы уже давали ранее ссылку на "Что такое NULL"

Следовало бы написать мне:
"Уже ранее eddoc написал про статью на сайте firebird: Что такое NULL?"
Ещё раз прошу прощения.
Автор: delover
Дата сообщения: 29.08.2012 19:40
eddoc
Я тоже прошу извинения, хотя мои оправдания сомнительны - мне не хватает на всё времени. Я как "бабочка" (из басни) порхаю то тут то там.

ant0ni02004
Извините, я не могу предполагать иногда до каких пределов сумасбродства дошли нынешнеи технологии. Попытался выразить на уровне предположений фантаста. Однако получилось:

Цитата:
Вот можете внятнее писать, если захотите.


Ещё раз делаю УПОР-

Цитата:
Ещё раз делаю упор - семиотики ищут общее. Находят. Это две функции мозга - поиск информации и анализ. Семиотики их выполняют на 100%. Третья функция - синтез.

Синтез с сервером иногда не под силу семиотикам, они не знают где надо регистрироваться и кого из пользователей просить. Если мысль нравится поддержите, а я вряд ли смогу воспользоваться преимуществами нового синтаксиса, я просто хотел объяснить свой сумбурный пост.
Автор: eddoc
Дата сообщения: 29.08.2012 22:57
delover, VABRO
Да ладно, ребята, проехали. Как говорится, кто старое помянет...
Автор: delover
Дата сообщения: 30.08.2012 10:56
eddoc
Ок.

Сегодня появился реально интересный вопрос-запрос. Сижу уже час под отладчиком идёт выполнение update по Id который есть подвыборке. Сразу оговорюсь, хотя это не FireBird всё же мне интересно, как это реально будет на FB. Обратите внимание на procDate

Код:
UPDATE tbl1 alias1
SET alias1.procDate=:dateNew
WHERE alias1.id in (
SELECT alias2.Id

FROM tbl2 as join2
RIGHT JOIN tbl1 as alias2 on join2.fild=alias2.fild
WHERE join2.Id IS NULL AND (alias2.procDate=alias2.createDate
OR alias2.procDate<=cast(:date as datetime)) AND
alias2.IsError=:p1 AND alias2.IsFlag=:p1 AND alias2.IsType=1
AND alias2.Priority<100)
Автор: delover
Дата сообщения: 30.08.2012 14:04
Да и всё таки про null на FireBird. О пустых строках.

Цитата:
NULL >= ''

Это не совсем верно (что это не известно). Что касается индексов и OrderBy, порядок значений NULL всегда идёт первым, а потом уже пустые строки. Следовательно, если существует поле в которое мы сможем записать порядковый номер выборки то NULL окажется меньше пустой сроки.
То есть OrderBy:
NULL, NULL, 1, 1, 2, 3, 4, 5
говорит что сравнение при сортировке сервером дало:
NULL NULL > 1 1 > 2 > 3 > 4 > 5

Но так считает сервер, а не SQL запрос.
Автор: delover
Дата сообщения: 30.08.2012 18:28
Я про то, что когда мне неизвестно, в ответ на вопрос - я молчу. Следовательно я сказал пустую строку, но она более пустая.

Добавлено:
Да, а и если давно в голове моей пусто, то это даже более пусто чем то, что недавно стало пустым. )))
Автор: exteris
Дата сообщения: 31.08.2012 07:51

Цитата:
Да и всё таки про null на FireBird. О пустых строках.
Цитата:
NULL >= ''

Это ни о чем не говорит, просто сервер показываем неизвестные значения первыми. Вы можете дописать в order by NULLS LAST и null-ы будут последними в списке.
Автор: delover
Дата сообщения: 31.08.2012 07:53
Да, а и если давно в голове моей пусто, то это даже более пусто чем то, что недавно стало пустым. )))
ещё и в обратном порядке можно )))
Автор: delover
Дата сообщения: 31.08.2012 11:53
Ещё раз проверил

Код: CREATE GENERATOR GEN_NEW_TABLE_ID;
CREATE TABLE NEW_TABLE (
NEW_FIELD INTEGER,
NAME VARCHAR(70)
);

SET TERM ^ ;
CREATE TRIGGER NEW_TABLE_BI FOR NEW_TABLE
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.new_field is null) then
new.new_field = gen_id(gen_new_table_id,1);
end^
SET TERM ; ^
Автор: AlexPetrovich
Дата сообщения: 31.08.2012 14:18
delover
"Это говорит о том, что для сортировки используется сравнение значений и если значения равны то дополнительно сравнивается их позиция в таблице."

Не верно.

Ничего дополнительно не сравнивается.
"и если значения равны" - то порядок неопределен/произвольный.

На свежей базе - возможно будет соответствовать порядку вставки записей.
А на уже поюзаной, после тысяч вставок/изменений/удалений - может получится вразнобой.

Автор: delover
Дата сообщения: 31.08.2012 14:47
AlexPetrovich
Если Вы будете объяснять это студентам, то студенты не смогут повторить серверную сортировку. И не факт что "поюзанная база" на стабильном оборудовании и безошибочном ПО будет менять порядок в котором добавлялись записи.
Автор: YuriyRR
Дата сообщения: 02.09.2012 23:56
delover

Цитата:
И не факт что "поюзанная база" на стабильном оборудовании и безошибочном ПО будет менять порядок в котором добавлялись записи

Вообще-то разговор шел о том, что в запросе порядок следования записей будет меняться с течением времени - и это факт. А о том что поменяется порядок в котором добавлялись записи никто и не говорил ).
Автор: delover
Дата сообщения: 03.09.2012 17:42
YuriyRR
Ну извините, я тоже бывает торможу, но я в начале подумал, что это как то связано с индексами ).
Автор: delover
Дата сообщения: 04.09.2012 17:29

Цитата:
"и если значения равны" - то порядок неопределен/произвольный.

Вы тогда пишите сразу, что жизнь г и всё г. Про сервер сказано мало...

Я правдо торможу бывает, но впечатления о моём сервере превосходят то что было до YuriyRR.


Добавлено:
После ещё выше
Автор: delover
Дата сообщения: 04.09.2012 19:39
Ну и есть ли Возможность узнать на сколько больше или меньше были являются пустота и неизвестность. Обе категории подвержены влиянию времени. Неизвестное становится более известным. Пустое место может быть уже занятым. Если в таблице в одной колонки всегда будут null. А в другой таблице все же встретился 1 null. Одна таблица давно пуста, а у другой это началось впервые. В первой таблице Давно пустое значение. И если я сравню два пустых из двух равных таблиц. И это сравнение двух неизвестностей обосновано количеством, что тоже подвержено времени. Опять же - что неизвестно давно...
Автор: exteris
Дата сообщения: 05.09.2012 07:24
delover
Уважаемый, вы окошко твиттера с окошком этого форума не путаете случаем. Харош флудить...
Автор: delover
Дата сообщения: 08.09.2012 18:33
exteris
Спасибо за возврат. У меня на повестке следующий запрос.


Код: select
a1, a2, b1,
update set t1.InProccess = Current_timestamp
from t1
where
То же самое условие апдейта что и для селекта.
Автор: delover
Дата сообщения: 12.09.2012 17:26
Поздравляю с днём ПРОГРАММИСТА
Автор: Maximus777
Дата сообщения: 17.09.2012 20:59
Уважаемые гуру! Помогите с триггером. Ситуация следующая, есть ключевое поле, последовательно увеличивающееся с каждой записью, одновременно с генератором. Иногда требуется удалить запись, соответственно в ключевом столбце нарушается последовательность. Знаю, что можно решить эту задачу с триггером, но опыта не хватает для создания оного. Надо перестроить ключевое поле и генератору присвоить число, которым заканчивается это поле. Например, было 1,2,3,4,5,6,7, (генератор=7) удалили 3, стало 1,2,4,5,6,7, а надо получить 1,2,3,4,5,6 (генератор=6). Гугля не помогла, вся надежда на вас.
Автор: volser
Дата сообщения: 17.09.2012 22:02
Maximus777
Это неправильный подход. В многопользовательской системе может получиться одинаковый ID. Зачем такое далеть? Чем не устраивают дырки в идах?
Автор: Maximus777
Дата сообщения: 17.09.2012 22:13
volser
а если как-то блочить базу на время, пока не отработает содержимое триггера? Это возможно?


Цитата:
Чем не устраивают дырки в идах?

Для очистки совести хочется, чтоб один к одному шло.
Автор: AlexCoRu
Дата сообщения: 17.09.2012 22:40
Maximus777, мне не нравится, что записи вставленные позже будут иметь меньший id.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465

Предыдущая тема: Сравнение двух строк


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.