Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » InterBase и FireBird: вопросы по работе и их решение

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104

Открыть новую тему     Написать ответ в эту тему

AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Обычная процедура, если я задал ID то хочу этот ID а если не задал - хочу все

На мой взгляд - две процедуры лучше. Например, SELECT_SALES_ALL и SELECT_SALES_DEPARTMENT (DEPARTMENT_ID).

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 11:53 25-08-2012 | Исправлено: AlexCoRu, 11:54 25-08-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это именно 2 процедуры - одна с параметром другая с суфиксом _null. Только удваивать придётся все процедуры в базе. - Весёлый путь к прогрессу.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 01:03 27-08-2012
ant0ni02004

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
delover

Цитата:
Это именно 2 процедуры

ну а в одной такой процедуре обычно что бывает?
что-то типа такого

Код:
 
......
if (param is null) then
begin
  ........ что-то делаем
  select ...... /*select all*/
end
else
begin
  ........ всё то же самое делаем
  select ...... where (id=:param) /*select by param*/
end
 

т.е. фактически те же две

Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 16:20 27-08-2012
AlexPetrovich

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
delover

Цитата:
Обычная процедура, если я задал ID то хочу этот ID а если не задал - хочу все. И кто скажет что это редкий случай?  

Дык уже:
Add support for "some_col = ? or ? IS NULL" conditions
 
http://tracker.firebirdsql.org/browse/CORE-2298

Всего записей: 87 | Зарегистр. 08-05-2003 | Отправлено: 17:33 27-08-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlexPetrovich
Эх спасибо, но боюсь я был опять не до конца понятен в выражении мысли. Ещё раз делаю упор - семиотики ищут общее. Находят. Это две функции мозга - поиск информации и анализ. Семиотики их выполняют на 100%. Третья функция - синтез. Всё таки, я не предлагал игнорировать особенности сервера. Если null <> null, то будет справедливо, что t1.id =?? null вернёт False. Это уже контекст сервера и его математической архитектуры. Я предложил, только, уйти немного от этого. Для PrimaryKey полей не произойдёт ничего существенного, но в других случаях будет дополнительная фильтрация или дополнительная выборка. Однако аксиоматический базис будет не тронут.  
 
Символ одного вопроса мне не по душе. - Я тогда ?mas_ могу перепутать.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 18:32 27-08-2012
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
delover, каким переводчиком (транслятором) для перевода на русский пользуешься?
 
Добавлено:
поведение null не особенность сервера, а sql.

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 20:58 27-08-2012
salexn1



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlexCoRu
Это не переводчик - это диагноз

Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 11:29 28-08-2012
ant0ni02004

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
delover

Цитата:
Если null <> null то  
 
null <> null имеет значение null а не true

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

t1.id =?? null вернёт NULL
 
вся фишка в том, что NULL не просто сам по себе, а это логическое значение
равноправное с остальными двумя (TRUE,FALSE)
и втроём они вместо бинарной логики (да/нет) составляют тернарную (да/нет/неизвестно)

Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 15:54 28-08-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ant0ni02004
Тогда постараюсь объяснить проще. У меня в паскале Си и бейсике нет следующей конструкции:

Код:
IF  (condition)  THEN
  proc1
ELSE
  proc2
UNKNOWN
  proc3;

Ну и при решении нужна ли мне конкретная запись из таблицы значение UNKNOWN мне не нужно. Мне нужно только Да/Нет...
В следующем коде

Код:
bool B1 = null; IF (B1) proc1;
 
компилятор ругается - Cannot convert null to 'bool' because it is a non-nullable value type.
Возможно IF(null) a1 else a2; должен выполнять оба оператора и a1 и a2?
 
В мат логике оператор => ,нам говорили, означает "следовательно". Следующее выражение должно быть верно:
"IF (2 <> 3) => (2 > 3) OR (2 < 3)"
аналогично:
"IF (null <> null) => (null > null) OR (null < null)".
Изходя из здравой логии верно так же:
"(null > null) AND (null < null)"
 
Для моего случая можно применить следующее  
"null1 >=?? null2"  ---->   "null1 >= null2 OR null2 IS NULL"
"null1 ??>= null2"  ---->   "null1 >= null2 OR null1 IS NULL".
Хотя вторая конструкция излишняя.
 
Добавлено:
Ну и теперь конкретно для нашего сервера является несправедливым инструкция сравнения с нуловым значением, и такая запись не попадает в выборку. Оператор IS NULL подразумевает что вы работаете с нуловыми значениями следовательно инструкция является корректной и такая запись может попасть в выборку. Оператор ?? тоже подразумевает, что Вы работаете с нуловыми выражениями и логика null<>null не совсем уместна.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 08:28 29-08-2012
VABRO



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот можете внятнее писать, если захотите.
 
NULL -- это не совсем третье логическое значение. Оно особняком держится от TRUE/FALSE (нужно специально изучать, как себя ведёт NULL при разных операциях).
"NULL" следует читать на русском, как "неизвестно". Поэтому сразу же по-житейски становится понятным многое из результатов операций с данными полей, в которых есть значения "NULL":
NULL == NULL? => NULL (неизвестность == неизвестности? => неизвестно)
 
Сложение и умножение точно так же себя ведёт, объединение строк точно такой же результат даёт. С житейского опыта - да не удобно.
Вот ещё при объединении таблиц, хитрых запросах появляются пустые значения, которые тоже NULL обозначаются, но тут в смысл у них -- "пустое значение/множество", а не "неизвестно".
 
В общем, кому не нравится, тому и нечего заниматься не своим делом, а то началось переливание из пустого в порожнее.
 
eddoc
Уже ранее писал про статью на сайте firebird: Что такое NULL?
Так приняли!
 
Но вон же меняют синтаксис и добавляют плюшки (как уже написал AlexPetrovich):
Add support for "some_col = ? or ? IS NULL" conditions
 
Пишите им, стучитесь, а не переливайте из пустого в порожнее. Сумеете аргументировано показать большие плюсы от своей хотелки -- есть большой шанс, что сделают (раз синтаксис дополняют). Но у меня подозрения, что такое поведение с выражением _where_ поломает совместимость.

Всего записей: 44 | Зарегистр. 24-08-2010 | Отправлено: 09:19 29-08-2012
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

Код:
var V: Variant;
if VarIsNull(V) then proc3
else
  if V then proc1
  else proc2;

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 09:25 29-08-2012
eddoc



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
VABRO

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

Во-первых, спорю не я. Во-вторых: именно эту ссылку я и привел спорщикам тут. Читайте форум внимательно, а не по диагонали.

Всего записей: 328 | Зарегистр. 25-11-2007 | Отправлено: 12:48 29-08-2012
ant0ni02004

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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

Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 16:35 29-08-2012
VABRO



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
eddoc
Прошу меня извинить. Да, виноват, сделал оплошность, как и delover: неправильно выразил свои мысли и плюс без указания в самом начале своего сообщения, кому адресую.
я адресовал _всё_ своё сообщение к delover.
В куске:

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

Неверно оформил свои мысли в предложении.
Я хотел там высказать, что Вы уже давали ранее ссылку на "Что такое NULL"
 
Следовало бы написать мне:
"Уже ранее eddoc написал про статью на сайте firebird: Что такое NULL?"
Ещё раз прошу прощения.

Всего записей: 44 | Зарегистр. 24-08-2010 | Отправлено: 20:01 29-08-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
eddoc
Я тоже прошу извинения, хотя мои оправдания сомнительны - мне не хватает на всё времени. Я как "бабочка" (из басни) порхаю то тут то там.
 
ant0ni02004
Извините, я не могу предполагать иногда до каких пределов сумасбродства дошли нынешнеи технологии. Попытался выразить на уровне предположений фантаста. Однако получилось:

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

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

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

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

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 20:40 29-08-2012
eddoc



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
delover, VABRO
Да ладно, ребята, проехали. Как говорится, кто старое помянет...

Всего записей: 328 | Зарегистр. 25-11-2007 | Отправлено: 23:57 29-08-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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)

Возникает смутное подозрение, что подвыборка не просто большая, она ещё вычисляется каждый раз для каждой записи, так как в подвыборке в условиях фигурирует поле которое изменяют. А как интересно происходит это в FireBird? Ну и я пока не знаю как оптимизировать это, так как там похоже нет оператора FOR SELECT.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 11:56 30-08-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да и всё таки про null на FireBird. О пустых строках.

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

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

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 15:04 30-08-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я про то, что когда мне неизвестно, в ответ на вопрос - я молчу. Следовательно я сказал пустую строку, но она более пустая.
 
Добавлено:
Да, а и если давно в голове моей пусто, то это даже более пусто чем то, что недавно стало пустым. )))

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 19:28 30-08-2012 | Исправлено: delover, 08:52 31-08-2012
exteris

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

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

Это ни о чем не говорит, просто сервер показываем неизвестные значения первыми. Вы можете дописать в order by NULLS LAST и null-ы будут последними в списке.

Всего записей: 382 | Зарегистр. 14-04-2003 | Отправлено: 08:51 31-08-2012
Открыть новую тему     Написать ответ в эту тему

Страницы: 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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » InterBase и FireBird: вопросы по работе и их решение


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru