![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 наиболее всего подходит.