Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Вопрос по T-SQL (число прочтений - 5059 )
bidler
Junior Member
**
Отсутствует



Сообщений: 68
Зарегистрирован: 06. Октября 2006
Вопрос по T-SQL
21. Марта 2008 :: 16:07
Печать  
Например в запросе есть условие:

where
          жр.DocNo<>$Док.Номер) OR
          Len(жр.DocNo)<10

как передать в результирующий набор, описание того по какому именно условию
отобран документ ?
Условий будет много. Документ проверяется на правильность заполнения реквизитов.
Как передать "Описание ошибки". Типа: "Номер документа меньше 10 символов" ?
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Вопрос по T-SQL
Ответ #1 - 21. Марта 2008 :: 16:08
Печать  
Кури Case().
  
Наверх
 
IP записан
 
bidler
Junior Member
**
Отсутствует



Сообщений: 68
Зарегистрирован: 06. Октября 2006
Re: Вопрос по T-SQL
Ответ #2 - 21. Марта 2008 :: 16:12
Печать  
a case() после select вставлять ?
Это получается дублировать условие и в select и в where ?
или я туплю ?
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Вопрос по T-SQL
Ответ #3 - 21. Марта 2008 :: 16:14
Печать  
Case ставить в раздел Select.
И делать их столько, сколько условий проверить надо.
  
Наверх
 
IP записан
 
bidler
Junior Member
**
Отсутствует



Сообщений: 68
Зарегистрирован: 06. Октября 2006
Re: Вопрос по T-SQL
Ответ #4 - 21. Марта 2008 :: 16:16
Печать  
select
        case when Len(жр.DocNo)<10 then 'Номер дока <10 ' end as Error
where
           Len(жр.DocNo)<10

так ?
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Вопрос по T-SQL
Ответ #5 - 21. Марта 2008 :: 16:18
Печать  
select
       (case when Len(жр.DocNo)<10 then 'Номер дока <10 ' Else '' End) ОшибкаДлиныНомера
Where
       Len(жр.DocNo)<10 
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Вопрос по T-SQL
Ответ #6 - 21. Марта 2008 :: 16:20
Печать  
Точнее:

select 
      (case
           when Len(жр.DocNo)<10 then 'Номер дока <10 '
           when Len(жр.DocNo)>10 then 'Номер дока >10 '
....
            Else '' End) Ошибка
Where
      Len(жр.DocNo)<10
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по T-SQL
Ответ #7 - 21. Марта 2008 :: 16:22
Печать  
sadovnikov писал(а) 21. Марта 2008 :: 16:20:
Точнее:

select  
      (case
           when Len(жр.DocNo)<10 then 'Номер дока <10 '
           when Len(жр.DocNo)>10 then 'Номер дока >10 '
....
            Else '' End) Ошибка
Where
      Len(жр.DocNo)<10

Есть мнение, что первое ветвление будет единственным.
  
Наверх
ICQ  
IP записан
 
bidler
Junior Member
**
Отсутствует



Сообщений: 68
Зарегистрирован: 06. Октября 2006
Re: Вопрос по T-SQL
Ответ #8 - 21. Марта 2008 :: 16:25
Печать  
спасибо за помощь, насколько я слышал вы серьезный специалист,
но несмотря на это отвечаете на примитивные вопросы...

Я надеялся что есть способ менее громоздкий.
Спасибо за консультацию.
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Вопрос по T-SQL
Ответ #9 - 21. Марта 2008 :: 16:27
Печать  
spock писал(а) 21. Марта 2008 :: 16:22:
Есть мнение, что первое ветвление будет единственным.


Я привел второй When только для примера, что можно в одном Case отработать несколько условий.
  
Наверх
 
IP записан
 
bidler
Junior Member
**
Отсутствует



Сообщений: 68
Зарегистрирован: 06. Октября 2006
Re: Вопрос по T-SQL
Ответ #10 - 21. Марта 2008 :: 16:31
Печать  
Предыдущий пост был адресован sadovnikov
Не хочу обидеть spock, я просто никого не знаю на этом форуме.

Мне как раз нужно проверить чтобы номер был не меньше 10.
Но это одно из условий, их будет много.
Я хотел выяснить в принципе, как можно это организовать.

спасибо всем за помощь
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по T-SQL
Ответ #11 - 21. Марта 2008 :: 16:33
Печать  
bidler писал(а) 21. Марта 2008 :: 16:31:
Предыдущий пост был адресован sadovnikov

да я понял из контекста.
  
Наверх
ICQ  
IP записан
 
bidler
Junior Member
**
Отсутствует



Сообщений: 68
Зарегистрирован: 06. Октября 2006
Re: Вопрос по T-SQL
Ответ #12 - 21. Марта 2008 :: 16:38
Печать  
sadovnikov писал(а) 21. Марта 2008 :: 16:27:
spock писал(а) 21. Марта 2008 :: 16:22:
Есть мнение, что первое ветвление будет единственным.


Я привел второй When только для примера, что можно в одном Case отработать несколько условий.


Спасибо. Я читал про case. Просто я наивно надеялся что это можно как то
провернуть из where  Улыбка
сильно не смейтесь , если возможно Улыбка
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по T-SQL
Ответ #13 - 21. Марта 2008 :: 16:43
Печать  
bidler писал(а) 21. Марта 2008 :: 16:38:
Просто я наивно надеялся что это можно как то
провернуть из where  Улыбка

Нужно обязательно стараться все ограничивать из WHERE. Иначе ты попадаешь на TABLE SCAN ИЛИ INDEX SCAN, что крайне плохо.
И во многих случаях следует OR заменять на UNION.
И главное - это попасть в индекс.
  
Наверх
ICQ  
IP записан
 
bidler
Junior Member
**
Отсутствует



Сообщений: 68
Зарегистрирован: 06. Октября 2006
Re: Вопрос по T-SQL
Ответ #14 - 21. Марта 2008 :: 16:56
Печать  
Да я понимаю.
Мне надо перебрать где то 150 тыс. доков и выбрать только ошибочные.
Я понимаю что я отбираю в where, обидно что нужно громоздить select
только для того чтобы сообщить по какому условию отобран док.
А нужно только то: Номер дока, дата и описание ошибки.
Условий будет много. Где то 20.
Может и стоит использовать UNION, просто тогда модуль по размеру будет не маленький.
Но зато и работать будет быстрей.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать