Использование в SELECT ... WHERE вычисляемых полей

mosalova
Дата: 13.12.2012 19:05:07
всем привет!

есть ComboBox, в котором три значения: 'все', 'м', 'ж'.
переменной polMW присваивается значение, выбранное пользователем

Сейчас выборка по полу выполняется так:
IF polMW='м' OR polMW='ж'
   SELECT fio,pol,data FROM table1 WHERE pol=polMW INTO cursor1
ELSE
   SELECT fio,pol,data FROM table1 INTO cursor1    && все
ENDIF


А хочется сделать это одной строкой для любого варианта!

Как в WHERE pol= указать, что нужно выбирать все записи, если пользователь выберет 'все', типа
SELECT fio,pol,data FROM table1  WHERE pol=* INTO cursor1
AndreTM
Дата: 13.12.2012 19:55:48
lcSex=IIF(polMW='м' OR polMW='ж',polMW,'мж')
SELECT fio,pol,data FROM table1 WHERE pol $ lcSex INTO cursor1
* бесполых, к сожалению, не отберёт...
ВладимирМ
Дата: 13.12.2012 20:16:57
Возможны, еще варианты

1. В качестве условия отбора можно указать просто логическую константу

SELECT fio,pol,data FROM table1 WHERE IIF(m.polMW='все', .T., pol=m.polMW) INTO cursor1


2. При настройке SET ANSI OFF (это настройка по умолчанию), сравнение символьных строк идет до окончания символов в самом коротком выражении. А это значит, что любая символьная строка будет равна пустой строке. Следовательно, для случая "все" надо подставить пустую строку (две кавычки подряд)

SELECT fio,pol,data FROM table1 WHERE pol = IIF(m.polMW='все', "", m.polMW) INTO cursor1


3. Если в таблице не может быть других значений кроме "М" и "Ж", то можно указать два условия, объединенных по OR или функцию Inlist() или директиву IN.

Local pol1, pol2
if m.polMW='все'
    pol1 = 'м' 
    pol2 = 'ж'
else
    store m.polMW to pol1, pol2
endif

SELECT fio,pol,data FROM table1 WHERE pol IN (m.pol1, m.pol2) INTO cursor1
ВладимирМ
Дата: 13.12.2012 20:26:14
Еще можно сравнить поле самим собой.

SELECT fio,pol,data FROM table1 WHERE pol = IIF(m.polMW='все', pol, m.polMW) INTO cursor1
mosalova
Дата: 13.12.2012 20:48:39
ВладимирМ
Возможны, еще варианты

3. Если в таблице не может быть других значений кроме "М" и "Ж", то можно указать два условия, объединенных по OR или функцию Inlist() или директиву IN.

Local pol1, pol2
if m.polMW='все'
    pol1 = 'м' 
    pol2 = 'ж'
else
    store m.polMW to pol1, pol2
endif

SELECT fio,pol,data FROM table1 WHERE pol IN (m.pol1, m.pol2) INTO cursor1


Заработало! Огромное спасибо! у меня подобного рода выборок много будет и такой вариант позволит уйти от кучи IF ELSE
glamis
Дата: 16.12.2012 20:40:01
mosalova,

SELECT fio,pol,data FROM table1 WHERE polMW = 'все or pol=polMW INTO cursor1