Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL [D7, XP]


Alex8 ©   (2007-07-28 13:42:00) 

Уважаемые мастера !
Вот такая ситуация :

SELECT * FROM Tiz WHERE iavt IN (1, 2, 3, 4) - работает

SELECT * FROM Tiz WHERE iavt IN (1 .. 4) - выдается ошибка

Это моя ошибка или  ".." в SELECT не допускается ?

BETWEEN мне по ряду причин не подходит.  Спасибо.


Вася Правильный   (2007-08-03 20:45:00) [1]

царю все позволено, но не все хочется


Anatoly Podgoretsky   (2007-08-03 20:42:00) [2]

> Вася Правильный  (03.08.2007 20:40:17)  [17]

Так не царское дело.


Вася Правильный   (2007-08-03 20:40:00) [3]


> зачем же царь занимается программированием?

от скуки


Anatoly Podgoretsky   (2007-08-03 14:26:00) [4]

> Плохиш  (03.08.2007 11:28:15)  [15]

А если не царское, то зачем же царь занимается программированием?


Плохиш   (2007-08-03 11:28:00) [5]


> Этот вопрос возник потому что оператор IN (вне SQL) допускает
> использование диапазона IN(a1, a2, a3..a7, a8).

Оператор IN в SQL или вне оного подчиняется определённым правилам, описанным в документации к SQL или "вне SQL", но как известно - не царское это дело документацию и справки читать.


Alex8   (2007-08-03 11:15:00) [6]

Спасибо Всем за участие в беседе.


Sergey13   (2007-08-03 08:39:00) [7]

> [9] Alex8   (02.08.07 18:43)
> 1. Я не знаю, как определить максимально допустимую длину запроса.
Текст запроса - это строка, которая имеет ограничение по длине.

> 2. Я не понял этой фразы по поводу оптимального плана
План выполнения запроса - это то как сервер выполняет запрос, что сначала, что потом. Из Москвы в Жмеринку можно ехать напрямую, а можно через Владивосток. Вот и в запросах так же.

> и не знаю, что такое ИМХО.
Абревиатура "По моему скромному мнению" по аглицки.


Anatoly Podgoretsky   (2007-08-02 20:51:00) [8]

Запись IN(a1, a2, a3..a7, a8). читается как Fld=a1 OR Fld between a3 and a7


Anatoly Podgoretsky   (2007-08-02 20:49:00) [9]


> Можно ли использовать диапозон в SELECT * FROM Tiz WHERE
> iavt IN (1 .. 4)
> или нет.(да, нет).

Диапазон в SQL называется BEETWEN


Desdechado   (2007-08-02 20:00:00) [10]

> В случае диапазона (пользователь задает его через "-")
> я легко заменяю "-" на ".." и вставляю в IN.
Что мешает свою "монотонность цикла" разбавить конструкцией " AND x BETWEEN :1 AND :2"? Элементарно до ужаса.

> Я не понял этой фразы по поводу оптимального плана и не знаю, что такое ИМХО.
Букварь читать по своей СУБД, там написано, чтотакое план запроса и на что он влияет и как на него влиять.


Alex8   (2007-08-02 18:43:00) [11]

>нарваться на превышение длины запроса
>Самый оптимальный план выполнения будет, ИМХО.

Согласен.  Но прошу прощения за свою темноту:
1. Я не знаю, как определить максимально допустимую длину запроса.
2. Я не понял этой фразы по поводу оптимального плана
              и не знаю, что такое ИМХО.
Был бы благодарен за соответствующие пояснения.


Sergey13   (2007-08-02 09:13:00) [12]

> [7] Alex8   (02.08.07 08:47)
> но хочется-то по-проще.

1. За ту неделю, что вопрос задал, можно было написать вполне "однотонный" цикл с парсером введенной юзером последовательности.
2. При таком подходе можно нарваться на превышение длины запроса, если юзер например ввдет 1-10000000 (типа ФСЁ)
3. Если в СУБД есть временные таблицы, можно использовать их. Заполнить номерами и сджойнить с главной таблицей. Самый оптимальный план выполнения будет, ИМХО.


Alex8   (2007-08-02 08:47:00) [13]

Честно говоря, я уже не ждал ответа на свой вопрос и
просто из любопытства заглянул на форум.
 Из одинаковой реакции собеседников делаю вывод, что
вопрос плохо сформулирован. Хотя мне казалось, что
все четко.
Можно ли использовать диапозон в SELECT * FROM Tiz WHERE iavt IN (1 .. 4)
или нет.(да, нет). И если можно, то где я ошибаюсь?
Этот вопрос возник потому что оператор IN (вне SQL) допускает
использование диапазона IN(a1, a2, a3..a7, a8).
И если, задавая вопрос, я говорю, что  Between мне не подходит,
то тем самым я исключаю ответы, которые, к сожалению, все-таки
поступили.

 Теперь, зачем мне это нужно ?
Дело в том, что SELECT у меня формируется програмно
Основноя схема SELECT * FROM Tiz Where iAvt IN(n1, n2 ....nN),
где n1, n2 ....nN коды объектов (они задаются пользователем),
последовательо добавляемых в IN при промотре этих объектов.
В случае диапазона (пользователь задает его через "-")
я легко заменяю "-" на ".." и вставляю в IN.
A при Between нарушается однотонность цикла.
Вообщем дополнительная работа.
Конечно, все можно сделать, но хочется-то по-проще.


MsGuns   (2007-07-29 22:34:00) [14]

>Юрий Зотов ©   (29.07.07 21:29) [5]
>Только зачем извращаться, если есть BETWEEN?

Ну сказано же - низзя ;)


Юрий Зотов   (2007-07-29 21:29:00) [15]

WHERE iavt > 0  AND  iavt < 5

Только зачем извращаться, если есть BETWEEN?


MsGuns   (2007-07-29 20:17:00) [16]

>Alex8   (28.07.07 13:42)  
>BETWEEN мне по ряду причин не подходит.  Спасибо.

Ну, если религия не позволяет, то

SELECT * FROM Tiz WHERE (iavt=1) or (iavt=2) or (iavt=3) or (iavt=4)


Desdechado   (2007-07-29 19:44:00) [17]

А справку по SQL почитать ломает?
IN - это не диапазон, это строгое перечисление, которое работает для любых типов данных.


Alex8   (2007-07-28 13:50:00) [18]


> Это моя ошибка или  ".." в SELECT не допускается ?


Anatoly Podgoretsky   (2007-07-28 13:47:00) [19]

BETWEEN наиболее всего подходит.


Наверх

Титульная страница Поиск, карта сайта Написать письмо