powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / ANN Вышел Firebird 3.0!
9 сообщений из 184, страница 8 из 8
ANN Вышел Firebird 3.0!
    #39357663
Shaman2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще один вопрос связанный уже с boolean полем:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  for select fc.fullfirmname, d.id_firm_condition,

         case d.flag_pay
           when 0 then sum(d.suma)
           else 0
         end as balance,

         case d.flag_pay
           when 1 then sum(d.suma)
           else 0
         end as balance_nal,

         d.id_currency, c.name as CurrName
      from documents d join currency c on d.id_currency = c.id_currency



в тройке d.flag_pay стало boolean и что я не выдумываю, а case с boolean не дружит. Как победить?

также как преобразовать конструкции вида:
Код: sql
1.
where ((d.flag_pay=:flag_pay) or (:flag_pay=-1))


?
...
Рейтинг: 0 / 0
ANN Вышел Firebird 3.0!
    #39357672
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shaman2,

потому что boolean автоматически не конвертируется в 1 и 0. BOOLEAN тип может принимать значения {TRUE | FALSE |UNKNOWN | NULL}.

поэтому варианта 2

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
     
...    
case 
  when not d.flag_pay then sum(d.suma)
  else 0
end as balance,
case 
  when d.flag_pay then sum(d.suma)
  else 0
end as balance_nal,
...



и более короткий

Код: sql
1.
2.
3.
4.
5.
         
...
IIF(not d.flag_pay, sum(d.suma), 0) as balance,
IIF(d.flag_pay, sum(d.suma), 0) as balance_nal,
...
...
Рейтинг: 0 / 0
ANN Вышел Firebird 3.0!
    #39357677
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисвроде защиты от распространённой ошибки админов
тем не менее, этот самый default на вновь созданном столбце вводит в заблуждение. Если после этого посмотреть записи, то столбца-то по факту в виде данных нет, но выводиться будет default. Т.е. как бы видно, что столбец заполнен.
Но как я понимаю, именно в случае бэкапа в бэкап как раз будет записан default, а не "пусто". И restore спасен, и программиста обдурили :-)
...
Рейтинг: 0 / 0
ANN Вышел Firebird 3.0!
    #39357696
Shaman2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvСимонов Денисвроде защиты от распространённой ошибки админов
тем не менее, этот самый default на вновь созданном столбце вводит в заблуждение. Если после этого посмотреть записи, то столбца-то по факту в виде данных нет, но выводиться будет default. Т.е. как бы видно, что столбец заполнен.
Но как я понимаю, именно в случае бэкапа в бэкап как раз будет записан default, а не "пусто". И restore спасен, и программиста обдурили :-)

ага, только обычно по этой колонке строится foreign key и тут наличие дефаулт может привести к другой ошибке. Я кстати заметил что при alter column этот самый default можно убрать.

попутно еще один вопрос задам: если домен например integer, никак нельзя alter column сделать с integer на домен или с домена на integer? мне быстрее создать второй столбец, но не всегда это реально при наличии зависимостей
...
Рейтинг: 0 / 0
ANN Вышел Firebird 3.0!
    #39357719
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shaman2ага, только обычно по этой колонке строится foreign key и тут наличие дефаулт может привести к другой ошибке.

Если я собираюсь добавить not null столбец на который будет повешен FK, то я задам такое значение по умолчанию которое есть в таблице.

Shaman2Я кстати заметил что при alter column этот самый default можно убрать.

можно, и в этом случае приходим к тому что было до 3.0 с невосстановимыми бекапами.

Ксати кого не устраивает default всегда можно сделать что-то типа такого

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
ALTER TABLE tablename
ADD fieldname INT DEFAULT 0 NOT NULL;

COMMIT;

UPDATE tablename
SET fieldname = fieldname;

COMMIT;

ALTER TABLE tablename
ALTER fieldname DROP DEFAULT;

COMMIT;



Shaman2 если домен например integer, никак нельзя alter column сделать с integer на домен или с домена на integer?

Код: plaintext
ALTER TABLE tablename ALTER columnname TYPE domainname

не пробовал?
...
Рейтинг: 0 / 0
ANN Вышел Firebird 3.0!
    #39358092
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ALTER TABLE tablename
ADD fieldname INT DEFAULT 0 NOT NULL;
--COMMIT;
UPDATE tablename
SET fieldname = fieldname;
--COMMIT;
ALTER TABLE tablename
ALTER fieldname DROP DEFAULT;

COMMIT;





Для понимания, а не лучше ли в одной транзакции, что-бы потом не обнаружить, уже вставленных другой транзакцией, дефолтных значений?
p.s. конечно идеально данную операцию в монопольном режиме проделывать, но мало ли.
...
Рейтинг: 0 / 0
ANN Вышел Firebird 3.0!
    #39358337
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Nikolayv81!
You wrote on 1 декабря 2016 г. 11:59:43:

Nikolayv81> Для понимания, а не лучше ли в одной транзакциинельзя.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ANN Вышел Firebird 3.0!
    #39358440
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikolayV81а не лучше ли в одной транзакции
DDL не всегда выполняется при выполнении самого оператора DDL. Одни запросы выполняются сразу, другие выполняются только по commit (например, создание индексов), третьи выполняются частями - при выполнении оператора и по commit (создание pk/fk/unique constraints). Как именно выполняется конкретный ddl - точно знают только разработчики. От них рекомендация - ddl выполнять или в режиме автокоммита, или явно делать коммит после каждого оператора ddl.
Тут есть исключения, конечно, например для грантов. Гранты можно и в одной транзакции забабахать.
...
Рейтинг: 0 / 0
ANN Вышел Firebird 3.0!
    #39361458
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно говоря, напрашивается хрень, аналогичная https://en.wikipedia.org/wiki/Memory_barrier

Какой-нибудь exclusive lock в рамках соединения. Или ещё лучше, если возможно, в рамках всей БД.

При начале выполнения DDL - выставляться, после полного выполнения - сниматься.

Если какой-то DDL выполнен не полностью, то следующий DDL просто не пройдет пока не.
...
Рейтинг: 0 / 0
9 сообщений из 184, страница 8 из 8
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / ANN Вышел Firebird 3.0!
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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