Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос IIF / 6 сообщений из 6, страница 1 из 1
14.08.2012, 14:35
    #37915942
mr.zlodey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос IIF
Добрый день. Использую vfpoledb в программе на c#, есть запрос:
SELECT a.tn, sum(IIF(vid=99 OR vid=38, a.sum, 0)) as s1, sum(IIF(vid=1 OR vid=2, a.sum, 0)) as s2 FROM D:\zug.dbf a GROUP BY a.tn
В качестве условия удобнее было бы использовать формат "vid in (99,38)", но при использовании in внутри iif получаю ошибку.
Для выполнения подобного рода запроса единственный вариант использовать OR для перечисления условия или возможны варианты с in?
...
Рейтинг: 0 / 0
14.08.2012, 14:42
    #37915959
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос IIF
inlist()
Код: sql
1.
iif(inlist(vid, 99, 38), a.sum, 0))
...
Рейтинг: 0 / 0
14.08.2012, 14:53
    #37915993
mr.zlodey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос IIF
Dima T,

Спасибо.
...
Рейтинг: 0 / 0
14.08.2012, 15:21
    #37916093
mr.zlodey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос IIF
inlist не поддерживает более 25 элементов в условии, получаю ошибку, а мне как минимум нужно 30.
...
Рейтинг: 0 / 0
14.08.2012, 16:09
    #37916235
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос IIF
mr.zlodeyinlist не поддерживает более 25 элементов в условии, получаю ошибку, а мне как минимум нужно 30.
Есть такое ограничение, тогда через курсор с индексом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
create cursor FilterVid (vid i)
insert into FilterVid values (99)
insert into FilterVid values (38)
...
index on vid tag vid

select  a.tn, sum(IIF(IndexSeek(a.vid, .F., 'FilterVid', 'vid'), a.sum, 0)) as s1, ...


или с джоинами тоже самое
Код: sql
1.
2.
3.
...
select  a.tn, sum(IIF(isnull(FilterVid.vid), 0, a.sum) as s1, ...
     from D:\zug.dbf a left join FilterVid on a.Vid = FilterVid.Vid ...


только во втором случае надо проверять чтоб задвоений не было в FilterVid, иначе неправильно посчитает.
...
Рейтинг: 0 / 0
14.08.2012, 18:32
    #37916535
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос IIF
В приниципе, никто не мешает объединить несколько inlist() через OR

Код: sql
1.
iif(inlist(vid, 99, 38, ...) or inlist(vir,1,2,...), a.sum, 0))



В каждом отдельном inlist() не более 25 значений, но через OR можно объединить бОльшее количество. Хотя, это фактически тот же вариант записи через OR все 30 значений, но более сложный.

Если команда формируется во вне, то я бы не заморачивался и оставил 30 сравнений, объединенных через OR.

PS: В принципе, можно еще через массивы попробовать, но не знаю, пройдет ли это через OLEDB

Код: sql
1.
2.
3.
4.
5.
6.
7.
Dimension aS1[30]
aS1 = 0   && значение по умолчанию для всех элементов массива
aS1[1] = 99
aS1[2] = 38
...

iif(ascan(aS1,vid)>0, a.sum, 0)
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос IIF / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]