2016-03-30 66 views
1

我的選擇屏幕上有幾個複選框。每個複選框都對應一個表格的字段可以採用的值。然後,我必須激發一個選擇查詢,其中某個表的特定字段可以包含所有相應複選框被選中的值。帶有多個值的字段的sql select語句

假設我有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

一種可能的方法:將選中的值附加到內部表中,然後在select語句中使用FOR ALL ENTRIES。