2016-03-30 6 views
1

У меня на моем экране выбора несколько флажков. Каждый флажок соответствует значению, которое может принимать поле таблицы. Затем я должен запустить запрос выбора, где конкретное поле таблицы может иметь все значения, чей соответствующий флажок установлен.Оператор select sql с полем, имеющим несколько значений

Предположим, у меня есть 5 флажок, соответствующий значениям a1-a5. Теперь, если отмечены флажки 1, 3 и 4, поле таблицы может иметь значения a1 или a3 или a4.

select * from table where field = a1 or field = a2 or field = a3. 

Один из способов сделать это является создание 5 переменных, а затем сделать что-то вроде этого

if checkbox1 checked 
    then var1 = a1 
else 
    var1 = '0' //something which would never occur in the field of the table 

и так далее для всех флажков.

А потом

select * from table where field = var1 or field = var2 or field = var3 or field = var4 or field = var5. 

Это становится трудным, если есть 15 Флажки. Есть ли лучший способ сделать это?

+2

Try IN; 'где поле IN (var1, var2, var3, ....)'. Вам все равно нужно создать список внутри IN, но может быть проще. – artm

ответ

4

Использовать select-option/range table для этого:

DATA field_range TYPE RANGE OF data_type_of_table_field. 

IF p_check1 = abap_true. 
    field_range = VALUE #(BASE field_range (sign = 'I' option = 'EQ' low = 'A1')). 
ENDIF. 
IF p_check2 = abap_true. 
    field_range = VALUE #(BASE field_range (sign = 'I' option = 'EQ' low = 'A2')). 
ENDIF. 
" ... 

SELECT whatever FROM wherever WHERE field IN field_range. 

ВНИМАНИЕ: таблицу пустой диапазон будет соответствовать ничего («без ограничений») и извлечь все содержимое таблицу базы данных, поэтому вам обычно нужно проверить это отдельно.

+1

Хорошее использование нового синтаксиса. +1 В последнее время введено ключевое слово 'BASE'? Я получаю синтаксическую ошибку в своей системе. – Jagger

+0

@Jagger Попробуйте 'BASE field_range []' - но кроме этого, я думаю, что он был там все время с новым синтаксисом ... – vwegert

+0

У меня есть сотрудник, который испытал дамп, если записи в таблице диапазонов (I/EQ) превышают некоторую определенную величину. Кто-то еще здесь тоже? – icbytes

0

Попробуйте как этот

select * from table where field IN (a1,a2,a3 ...) 
0

один возможный способ: добавьте проверенные значения во внутреннюю таблицу, а затем используйте FOR ALL ENTRIES в инструкции select.