Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Настройка NULL-значений


Автор: MadCoder 29.9.2009, 10:27
Доброго времени суток!

Подскажите, есть ли возможность настроить БД так, чтобы следующий код:
Код

select last_name+first_name+mid_name from users

выдавал не NULL, если одно из значений (last_name, first_name, mid_name) is NULL.

isNULL и COALESCE не предлагать - написать куча селектов в скриптах и программах, не хочется везде прописывать.

Также интересует, какие последствия кроме сложения с NULL это может дать: будут ли верно работать isNULL, is NULL, is not NULL и т.д.

Автор: Akina 29.9.2009, 10:54
Цитата(MadCoder @  29.9.2009,  11:27 Найти цитируемый пост)
есть ли возможность настроить БД так, чтобы следующий код:
выдавал не NULL, если одно из значений (last_name, first_name, mid_name) is NULL.

Запросто!
Один раз пройти по таблице и заменить Null на пустую строку. Изменить свойства полей, добавить Default Value (ту же пустую строку) и наложить требование Not Null.

Автор: Zloxa 29.9.2009, 11:22
http://msdn.microsoft.com/ru-ru/library/ms176056%28SQL.90%29.aspx

Код

set CONCAT_NULL_YIELDS_NULL  off
select 'привет'+ v from 
  (select null v) s
where v is null

------
привет

(1 row(s) affected)



Добавлено через 3 минуты и 12 секунд
Цитата

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

Автор: MadCoder 29.9.2009, 11:46
Цитата(Zloxa @  29.9.2009,  11:22 Найти цитируемый пост)
Важно!В будущей версии Microsoft SQL Server эта возможность будет удалена. Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется.


Интересно, а почему так? Че это грозит?

Автор: Zloxa 29.9.2009, 12:19
Цитата(MadCoder @  29.9.2009,  11:46 Найти цитируемый пост)
Интересно, а почему так? 

Потому что фича лишь для обратной совместимости реализована
Цитата(MadCoder @  29.9.2009,  11:46 Найти цитируемый пост)
Че это грозит?

Там же написано...."В будущей версии Microsoft SQL Server эта возможность будет удалена"
Судя по тому, что M$ сделали с офисом и IE8, начинает казаться вполне допустимым, что эти угрозы могут сбыться.

Автор: Akina 29.9.2009, 12:39
MadCoder, а почему непременно хочется оставить всё сделанным через то самое место? Какую великую смысловую нагрузку несут эти самые Null?

Автор: MadCoder 29.9.2009, 13:58
Цитата(Akina @ 29.9.2009,  12:39)
MadCoder, а почему непременно хочется оставить всё сделанным через то самое место? Какую великую смысловую нагрузку несут эти самые Null?

Потому что в результате комплиментации нула, например если пользователь не указал свое отчество, у нас будет не фио, а NULL. ИзНулл везде переписывать не слишком хочется, но видимо придется.

Автор: Akina 29.9.2009, 14:04
Нет, блин, кому я тут распинаюсь-отвечаю, а? Ну переписывай...

Автор: SharedNoob 1.10.2009, 19:57
юзайте вьюхи.

Автор: DimW 2.10.2009, 12:17
Цитата(Akina @  29.9.2009,  10:54 Найти цитируемый пост)
Один раз пройти по таблице и заменить Null на пустую строку.

Akina,  а в MSSQL разве null и пустая строка это не одно и то же?  smile 

в оракле такого разделения нет:
Код

SQL> create table TABLE1
  2  (
  3    NAME VARCHAR2(50)
  4  );
 
Table created
SQL> insert into table1 values('');
 
1 row inserted
SQL> select nvl(t.name, 'null') from table1 t;
 
NVL(T.NAME,'NULL')
--------------------------------------------------
null


Добавлено через 5 минут и 6 секунд
Цитата(SharedNoob @  1.10.2009,  19:57 Найти цитируемый пост)
юзайте вьюхи. 

как использование вьюх спасет от переработки кода? 

Автор: Akina 2.10.2009, 12:36
DimW, я в ораклах ничего не понимаю, но ... Что будет если так:
Код

create table table1
(
id integer
name varchar2(50)
);

insert into table1 (id, name) values (1,'');
insert into table1 (id) values (2);

select * from table1 where name is null;
select * from table1 where name is not null;
? Конечно, 2 последних селекта тебе придётся модифицировать в синтаксис оракла.

Автор: Zloxa 2.10.2009, 12:46
DimW, В M$ пустая строка не null

Akina, В оракле пустая строка is null (со всеми вытекающими, интуитивно неочевидными для пришельцев с других платформ: - типа length('') возвращает null а не 0)

 smile

Добавлено @ 12:55
Цитата(DimW @  2.10.2009,  12:17 Найти цитируемый пост)
как использование вьюх спасет от переработки кода?  

Вьюхи выставить клиенту вместо таблиц.
Во вьюхах вместо нулов возвращать пустые строки.

Вполне себе решение, если мы не имеем доступа к исходникам клиента.
Однако, я так понял, ТС полностью владеет оными.

Автор: Akina 2.10.2009, 13:01
Цитата(Zloxa @  2.10.2009,  13:46 Найти цитируемый пост)
В оракле пустая строка is null (со всеми вытекающими, интуитивно неочевидными для пришельцев с других платформ: - типа length('') возвращает null а не 0)

Какой ужас...  smile впрочем, по сравнению с закидонами MySQL это невинная детская шалость.

Автор: DimW 2.10.2009, 13:03
Цитата(Akina @  2.10.2009,  12:36 Найти цитируемый пост)
Что будет если так:

Код

SQL> create table table1
  2  (
  3  id integer,
  4  name varchar2(50)
  5  );
 
Table created
SQL> insert into table1 (id, name) values (1,'');
 
1 row inserted
SQL> insert into table1 (id) values (2);
 
1 row inserted
SQL> select * from table1 where name is null;
 
                                     ID NAME
--------------------------------------- --------------------------------------------------
                                      1 
                                      2 
SQL> select * from table1 where name is not null;
 
                                     ID NAME
--------------------------------------- --------------------------------------------------


Цитата(Zloxa @  2.10.2009,  12:46 Найти цитируемый пост)
DimW, В M$ пустая строка не null

с дрожащими коленями совершаю ретуал сжения девственных книг по mssql запылившихся в нашем шкафу  smile

Добавлено через 1 минуту и 58 секунд
Цитата(Akina @  2.10.2009,  13:01 Найти цитируемый пост)
Какой ужас...  

взаимно  smile

Добавлено через 12 минут и 19 секунд
Цитата(Zloxa @  2.10.2009,  12:46 Найти цитируемый пост)
Вьюхи выставить клиенту вместо таблиц.

я уже не вчем не уверен, но:

Код

SQL> create table table1
  2  (id integer);
 
Table created
SQL> create or replace view table1 as
  2    select *
  3      from table1;
 
create or replace view table1 as
  select *
    from table1
 
ORA-00955: name is already used by an existing object
 
SQL> 


т.е. без переименования таблиц не обойтись.

Автор: Zloxa 2.10.2009, 13:26
Цитата(DimW @  2.10.2009,  13:03 Найти цитируемый пост)
без переименования таблиц не обойтись.

Ну да.. когда я использовал слово "вместо", я счел что переименование либо перенос в другую схему подразумевается. smile

Цитата(Akina @  2.10.2009,  13:01 Найти цитируемый пост)
Какой ужас... 

ну, на самом деле к этому быстро привыкаешь.
Зато потом, привыкнув, ужасом кажестя когда конкатенация с null возвращает null smile /*Хотя.. это вполне логично.*/ И приходится интенсивно напрягать извилины, чтобы выдумать пример, когда понятия Null и "пустая строка" следует разделять и это действительно имеет смысл и выглядит разумно. smile

Автор: DimW 2.10.2009, 13:38
Цитата(Zloxa @  2.10.2009,  13:26 Найти цитируемый пост)
Ну да..

да, из всего изложенного ИМХО самый не трудоемкий и прозрчный способ подкостылиться.  smile 

Автор: Zloxa 2.10.2009, 13:45
Цитата(DimW @  2.10.2009,  13:38 Найти цитируемый пост)
подкостылиться

Именно smile
Я жиш ограничил, вроде, область применения этого кастыля. smile
Когда мы имеем возможность модифицировать базу, но не имеем возможность вмешаться в клиентский код.

Добавлено через 6 минут и 14 секунд
PS.
Кстати, в паре проектов я использовал подобные методы не как кастыли а как архитектурное решение.
Вьюхи выставлялись клиенту в качестве интерфейса. Бизнес логика реализовывалась в instead of триггерах.

Удобно? Безусловно! smile 

Мне даже кажется что вьюха, в качестве интерфейса, много более эстетична нежели пакет с торчащими из него процедурами "на все случаи жизни" smile

Автор: DimW 2.10.2009, 14:11
Цитата(Zloxa @  2.10.2009,  13:45 Найти цитируемый пост)
а как архитектурное решение

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

Цитата(Zloxa @  2.10.2009,  13:45 Найти цитируемый пост)
Удобно? Безусловно!
  smile  я под сталом

Автор: Zloxa 2.10.2009, 15:18
Ех.. чота мы в офтоп уходим....
Будучи комодом, чуствую себя обязанным поругаться:
Модератор: Давайте вернёмся к теме обсуждения.

Но будучи еще и участником, не могу не ответить  smile 
Цитата(DimW @  2.10.2009,  14:11 Найти цитируемый пост)
других мотиваций для использования такой архитектуры я не вижу

Приходилось хранить в базе расчетные значения.
В качестве аргументов для расчета использовались данные из нескольких таблиц.
Реализация расчетов в триггерах, сам понимаешь почему не канает - мутация и дедлоки.
Пришлось серьезно повозиться над контролем согласованности даннынх.
Честно говоря на том проекте впервые столкнулся с задачей, для реализации которой предпочтительнее блокировочник а не версионник. Принципиальное отсутствие SHARED/*http://ru.wikipedia.org/wiki/%D0%91%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_(%D0%A1%D0%A3%D0%91%D0%94)#.D0.A1.D0.BE.D0.B2.D0.BC.D0.B5.D1.81.D1.82.D0.BD.D1.8B.D0.B5_.D0.B1.D0.BB.D0.BE.D0.BA.D0.B8.D1.80.D0.BE.D0.B2.D0.BA.D0.B8*/ LOCK в Оракле очень портит жизнь на таких задачах. Собственным решением оказался крайне не удовлетворен. Но использование вьюхи вместо АПИ было очень даже в тему.

Автор: DimW 2.10.2009, 15:39
Цитата(Zloxa @  2.10.2009,  15:18 Найти цитируемый пост)
Ех.. чота мы в офтоп уходим....

если не здесь, то где еще... smile

MadCoder,  приношу извинения, отвлекся smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)