Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: SQL & NULL  (Прочитано 26119 раз)
0 Пользователей и 8 Гостей смотрят эту тему.
little
Помогающий

de
Offline Offline
Пол: Мужской

« : 11-08-2003 11:53 » 

Есть запрос, формирующий результат и сортирующий его по категории, подкатегории и номеру позиции. Бывает, что подкатегория отсутствует ( is NULL), в этом случае эта строка лезет на самый верх в данной категории. Мне же нужно, чтобы она была внизу (последней в своей категории), как это сделать?

Код:
SELECT tp.PriceLIstCategoryID, tpc.PriceListCategoryName, tp.PriceListSubCategoryID, tpsc.PriceListSubCategoryName, tp.ServiceID, tp.ServiceName, tp.PriceListLineNumber, 
tp.ServicePrice1, tp.ServicePrice2
From tblPriceList As tp, tblPriceListCategories As tpc, tblPriceListSubCategories As tpsc
Where tp.PriceListCategoryID=tpc.PriceListCategoryID And )tp.PriceListSubCategoryID = tpsc.PriceListSubCategoryID:
UNION ALL SELECT tp.PriceLIstCategoryID, tpc.PriceListCategoryName, tp.PriceListSubCategoryID, Null As PriceListSubCategoryName, tp.ServiceID, tp.ServiceName, tp.PriceListLineNumber,
tp.ServicePrice1, tp.ServicePrice2
From tblPriceList As tp, tblPriceListCategories As tpc
Where tp.PriceListCategoryID=tpc.PriceListCategoryID And )tp.PriceListSubCategoryID Is Null:
Order By tp.PriceListCategoryID, tp.PriceLIstSubCategoryID, tp.PriceListLineNumber;
Записан
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 11-08-2003 12:03 » 

Нужно использовать чтото типа
Order By tp.PriceListCategoryID, isnull(tp.PriceListSubCategoryID,100000) , tp.PriceListLineNumber;
Записан

Да да нет нет все остальное от лукавого.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 11-08-2003 12:30 » 

Цитата: PSD
Order By tp.PriceListCategoryID, isnull(tp.PriceListSubCategoryID,100000) , tp.PriceListLineNumber;

Наверно все-таки ifnull()
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 11-08-2003 12:47 » 

Нет именно isnull. Главное чтобы слитно.  is null или is not null  используется в where  , а isnull это функция.
Записан

Да да нет нет все остальное от лукавого.
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #4 : 11-08-2003 13:01 » 

Дык, isnull имеется в Access-овском SQL или нет? Неизвестно?

Да и вообще, что она делает?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 11-08-2003 13:19 » new

Ну не знаю как у "вас", а у нас isnull() принимает один аргумент - вот я и подумал что ошибка. А ifnull() тут как раз вписывается.

Цитата
Дык, isnull имеется в Access-овском SQL или нет? Неизвестно?

Попробуй - узнаешь.
isnull(x) возвращает логическое значение true (или 1 - у какого как) на x равное NULL и, соотв., false (0) на NOT NULL.
ifnull(x,y) - если x не равно NULL, то его же и возвращает, иначе y.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #6 : 12-08-2003 05:50 » 

То есть в данном случае мне предлагается вместо Null выплевывать огромное значение, которое будет заведомо больше всех имеющихся?
Записан
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 12-08-2003 06:12 » 

Да, или -1 и выполнять сортировку с DESC. В
 SQL Server(помню что у тебя акцес и не уверен что прокатит ) можно еще и так
Цитата

Order By tp.PriceListCategoryID,

case when tp.PriceListSubCategoryID is null then 1 else 0 end, --  создаем еще один критерий сортировки

tp.PriceListSubCategoryID , tp.PriceListLineNumber
Записан

Да да нет нет все остальное от лукавого.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 12-08-2003 07:20 » 

Цитата
case when tp.PriceListSubCategoryID is null then 1 else 0 end

А вот как раз эту длинную строчку и призвана заменять ф-ия isnull() . Если, конечно, она есть в access-е...

Кстати, есть ли у кого нормальная документация по access (97,2000 - хоть какая)? На msdn library нашел только мусор.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 12-08-2003 07:39 » 

Цитата

Цитата:
case when tp.PriceListSubCategoryID is null then 1 else 0 end

А вот как раз эту длинную строчку и призвана заменять ф-ия isnull() . Если, конечно, она есть в access-е...


Не совсем верно, isnull заменяет NULL осмысленым значением и только его.
А здесь иметт место четкое разбиение на две группы(еще один критерий). Элегантно обходим ситуацию  когда ID  догонит заведомо болшее значение.
Записан

Да да нет нет все остальное от лукавого.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 12-08-2003 07:46 » 

2PSD: из твоих слов нахожу, что MSSQL и MySQL серьезно различаются. В MySQL isnull() возвращает не что попало, а 0 или 1.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 12-08-2003 08:21 » 

Это не MSSQL а T-SQL  
 
Цитата

В MySQL isnull() возвращает не что попало, а 0 или 1.


В Т-SQL  аналогом будет конструкция [поле]  is [not] null   и собственно это помоему из ANSY SQL 2.
Но это не суть важно главное сама идея, как ее закодировать это другой вопрос.
Записан

Да да нет нет все остальное от лукавого.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 12-08-2003 08:46 » 

Выражение "IS NULL" тоже есть и используется там где положено (после ON, WHERE и т.п.), а "ISNULL()" - это ф-ий, которая также может использоваться между SELECT и FROM.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 12-08-2003 08:55 » 

Понятно, это я упустил из виду.
В Т-TSQL аналога нет но всегда можно воспользоваться CASE.
Записан

Да да нет нет все остальное от лукавого.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 12-08-2003 11:25 » 

Диалекты...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #15 : 12-08-2003 11:35 » 

Сейчас испытаю case, но очень не уверен в его наличии...
Записан
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #16 : 12-08-2003 12:01 » 

Нет, не ведает Access о наличии case... Жаль

Ну, в общем, я подставил мульён в качестве ID-шника, в данной ситуации они до него все равно никогда не доберутся. Теперь все красиво.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 12-08-2003 12:09 » 

Слабоват что-то access...
Если пишешь на C, то порекомендую MySQL - есть такая фича как embedded server. Это когда движок сервера подключается к программе как обычная библиотека - работать можно так же как и с "обычным" сетевым сервером.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #18 : 13-08-2003 05:35 » 

Уж слишком дохрена там уже понаписано, чтобы переводить на C. Да и не работал я с базами из под C  вообще.
Записан
query
Гость
« Ответ #19 : 13-08-2003 05:54 » 

Цитата: little
Нет, не ведает Access о наличии case... Жаль

Ну, в общем, я подставил мульён в качестве ID-шника, в данной ситуации они до него все равно никогда не доберутся. Теперь все красиво.

по моему самый простой способ в Access это SELECT IIF(ISNULL(<Поле>), 100000, <поле>) .....
а в TSQL (MS SQLServer) еще проще SELECT ISNULL(<Поле>, 100000) ....
Записан
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #20 : 13-08-2003 13:02 » 

Цитата: query
по моему самый простой способ в Access это SELECT IIF(ISNULL(<Поле>), 100000, <поле>)

А по-моему Вы тут что-то напутали. IIF - это VB-шный оператор, которого в SQL никак не присутствует. По описаниям от MS, в Access имеется аналог ANSI SQL-89, в MS Jet 4.0 OLE DB он немного расширен и поддерживает некоторые вещи из ANSI SQL-92, многие из которых работают только для adp-проектов (т.е. в клиент серверных приложениях).

Таким образом Access обычно что-то не умеет из стандартов SQL, а говорить о том, что в его SQL-е есь что-то свое (вроде IIF) тут уж не приходится.
Записан
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 14-08-2003 04:22 » 

Цитата

Таким образом Access обычно что-то не умеет из стандартов SQL, а говорить о том, что в его SQL-е есь что-то свое (вроде IIF) тут уж не приходится.

Спорить не буду(не знаю я акцес ) но помоему в Access очень плотно сплетен SQL и VBA поэтому такой вариант(с IIF) может запросто работать как и другие VB функции.
Записан

Да да нет нет все остальное от лукавого.
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #22 : 16-08-2003 11:32 » 

Нет, эта штука работает только в VBA, а также используется в значениях полей форм и отчетов, SQL же в Акцессе порезаный, а не "усиленный" Улыбаюсь

Вопрос в догонку:
Подключил библиотеку объектов ADO (ActiveX Data Objects), которая позволяет пользоваться более мощным SQL, чем DAO, в частности позволяет использовать хранимые процедуры (правда их не сравнить с T-SQL, но все же), виды, менять связи, управлять пользователями и разрешениями, и использовать транзакции.

И вот этот кусок не делает того что я от него хочу:
Код:
Public Function DropEmployee)id As Long: As Boolean
    Dim cmd As ADODB.Command
   
    DropEmployee = False
    Set cmd = New ADODB.Command
    cmd.ActiveConnection = CurrentProject.Connection
    cmd.CommandText = "Begin Transaction"
    On Error GoTo Sql_Error
    cmd.Execute
    cmd.CommandText = "Delete * From tblWorkDayServices Where WorkDayID In )Select WorkDayID From tblWorkDays " _
        & "Where EmployeeID = " & id & ":"
    cmd.Execute
    cmd.CommandText = "Delete * From tblWorkDayLines Where WorkDayID In )Select WorkDayID From tblWorkDays " _
        & "Where EmployeeID = " & id & ":"
    cmd.Execute
    cmd.CommandText = "Delete * From tblWorkDays Where EmployeeID = " & id
    cmd.Execute
    cmd.CommandText = "Delete * From tblAppointments Where EmployeeID = " & id
    cmd.Execute
    cmd.CommandText = "Delete * From tblEmployees Where EmployeeID = " & id
    cmd.Execute
    cmd.CommandText = "Commit"
    cmd.Execute
    DropEmployee = True
    Exit Function
   
Sql_Error{
    cmd.CommandText = "Rollback"
    cmd.Execute
End Function

Что не так?
Записан
little
Помогающий

de
Offline Offline
Пол: Мужской

« Ответ #23 : 19-08-2003 06:25 » 

Может, есть у кого какие мысли?
Записан
wiz
Гость
« Ответ #24 : 31-01-2006 19:17 » 

я сам мечтаю розобраться в загадочном SQL (особенно с "select*") и в VBA еслиб меня кто небуть розчехлил...  Улыбаюсь
Записан
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 01-02-2006 14:38 » 

wiz, в этом вам поможет книга Мртина Граббера "Понимание SQL"
Смотреть здесь:
http://www.sql.ru/docs/sql/u_sql/index.shtml#ch1
Записан

С уважением, Oldy.
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #26 : 07-02-2006 06:17 » 


Вопрос в догонку:
Подключил библиотеку объектов ADO (ActiveX Data Objects), которая позволяет пользоваться более мощным SQL, чем DAO, в частности позволяет использовать хранимые процедуры (правда их не сравнить с T-SQL, но все же), виды, менять связи, управлять пользователями и разрешениями, и использовать транзакции.
...

Что не так?

У объекта Conection усть свои методы BeginTransaction, CommitTransaction и RollBackTransaction,
т.е давать команду на выполнение cmd.CommandText = "Begin Transaction" не надо, а правильнее использовать встроенные методы


Записан

I Have Nine Lives You Have One Only
THINK!
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines