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

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

ru
Offline Offline
Сообщений: 13


« : 25-09-2008 10:05 » 

к примеру, имеется условие вида

where a and b

где a и b - это некие выражения, вертающие булево значение.
Если a не выполнилось, будет ли обработано выражение b или нет ? (хочется как в c++ - однако Улыбаюсь )

или даже ели a ложно, то b тоже вычислится (съев при этом кусочек вычислительных мощей) ?
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 25-09-2008 10:19 » 

забыл уточнить: в b используется переменная, которая и проверяется в a. То есть если a ложно, то выражение b становится не нужным.
И хочется вместо ветвления через if всё записать одной строкой
Записан

McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #2 : 25-09-2008 10:31 » 

where a and b обрабатывается как единое целое, условие выполнится только тогда, когда и a и b вернут то что удовлетворяет условию
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 25-09-2008 11:13 » 

короче, насколько понимаю, дважды писать половину всё равно придётся )
Записан

RXL
Технический
Администратор

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

WWW
« Ответ #4 : 25-09-2008 18:44 » 

Алексей1153++, ты только описываешь логическое выражение, а как, что и в каком порядке выполняется - целиком зависит от сервера БД и его оптимизатора запросов.

Нельзя написать "половину". "A" и "A AND B" - совершенно разные выражения.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

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

« Ответ #5 : 25-09-2008 19:51 » 

Если выражения:
Код:
A And B
A Or B
нужно интерпретировать в смысле:
Код: (Text)
A AndThen B
A OrElse B
В MS SQL Server это можно реализовать через условный оператор:
Код: (Text)
CASE WHEN A = 1 THEN B ELSE 0 END = 1
CASE WHEN A = 1 THEN 1 ELSE B END = 1
« Последнее редактирование: 25-09-2008 19:53 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

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

WWW
« Ответ #6 : 25-09-2008 20:03 » 

dimka, аналогичные конструкции есть в Oracle и MySQL. Синтаксис тот же.
Записан

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

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 26-09-2008 03:14 » 

о, спасибо ) Только вопрос:
CASE ....END  - это понятно,а что делает "=1" в конце строки ?
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 26-09-2008 03:16 » 

всё, допёр ))
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 26-09-2008 03:53 » 

A VARCHAR(1000) - строка, входной параметр, содержит строку вида '~N1~N2~...~N3~'

Код:
...
for select  F1, F2, F3....... FN from T
       where D
    into   :F1,:F2,:F3.......:FN  do begin.....end

(D - ещё какое то условие). Строка длиннющая, поэтому то и не хочется дважды повторять

с использованием переменной-фильтра с ветвлением это выглядит кошмарно:
Код:
if(:A is NULL) then
  ...
  for select  F1, F2, F3....... FN from T
         where D
      into   :F1,:F2,:F3.......:FN  do begin.....end
else
  ...
  for select  F1, F2, F3....... FN from T
         where D and not(:A containing '~'||T.ID||'~')
      into   :F1,:F2,:F3.......:FN  do begin.....end



можно записать общее условие так:
Код:
where D and :A is NULL   OR  D and not(:A containing '~'||T.ID||'~')

или, то есть

where D and (:A is NULL  OR  not(:A containing '~'||T.ID||'~'))

как теперь последнюю строку через case слабать ?

Код:
case when :A is NULL
then
   D
else
   D and not(:A containing '~'||T.ID||'~')
end
так ?
(D тоже не короткое, но тут уже было бы терпимо )) )

компилятор ругается на знак сравнения, который внутри D ...
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines