ABAP COND and SWITCH: Conditional Expressions Inline

Category
ABAP-Statements
Published
Author
Johannes

The expressions COND and SWITCH enable conditional value assignments inline, without separate IF- or CASE blocks. They return a value and can be used anywhere a value is expected.

COND – Conditional Expressions (like IF)

The COND expression evaluates conditions and returns the corresponding value.

Syntax

COND <type>(
WHEN <condition1> THEN <value1>
[ WHEN <condition2> THEN <value2> ]
[ ELSE <default_value> ]
)

Examples for COND

1. Simple Condition

DATA: lv_age TYPE i VALUE 25.
" Classic with IF
DATA: lv_status TYPE string.
IF lv_age >= 18.
lv_status = 'Adult'.
ELSE.
lv_status = 'Minor'.
ENDIF.
" Modern with COND
DATA(lv_status2) = COND string(
WHEN lv_age >= 18 THEN 'Adult'
ELSE 'Minor'
).

2. Multiple Conditions

DATA: lv_score TYPE i VALUE 75.
DATA(lv_grade) = COND string(
WHEN lv_score >= 90 THEN 'Excellent'
WHEN lv_score >= 80 THEN 'Good'
WHEN lv_score >= 70 THEN 'Satisfactory'
WHEN lv_score >= 60 THEN 'Adequate'
ELSE 'Failed'
).
WRITE: / 'Grade:', lv_grade. " Satisfactory

3. COND in Calculations

DATA: lv_quantity TYPE i VALUE 150.
" Discount tiers
DATA(lv_discount) = COND decfloat16(
WHEN lv_quantity >= 100 THEN '0.15' " 15%
WHEN lv_quantity >= 50 THEN '0.10' " 10%
WHEN lv_quantity >= 10 THEN '0.05' " 5%
ELSE '0.00'
).
DATA(lv_price) = 100 * ( 1 - lv_discount ).

4. COND with Complex Conditions

DATA: lv_age TYPE i VALUE 25,
lv_member TYPE abap_bool VALUE abap_true.
DATA(lv_ticket_price) = COND i(
WHEN lv_age < 6 THEN 0 " Children free
WHEN lv_age < 18 OR lv_age >= 65 THEN 10 " Reduced
WHEN lv_member = abap_true THEN 15 " Members
ELSE 20 " Regular price
).

5. COND for Structure Fields

TYPES: BEGIN OF ty_result,
status TYPE string,
message TYPE string,
END OF ty_result.
DATA: lv_code TYPE i VALUE 200.
DATA(ls_result) = COND ty_result(
WHEN lv_code = 200 THEN VALUE #( status = 'OK' message = 'Successful' )
WHEN lv_code = 404 THEN VALUE #( status = 'ERROR' message = 'Not found' )
WHEN lv_code = 500 THEN VALUE #( status = 'ERROR' message = 'Server error' )
ELSE VALUE #( status = 'UNKNOWN' message = 'Unknown code' )
).

6. COND with LET (Local Variables)

DATA(lv_message) = COND string(
LET today = sy-datum
age = 30
IN
WHEN today+4(2) = '12' THEN |December, { age } years old|
ELSE |Normal month, { age } years old|
).

7. COND with THROW (Raise Exception)

DATA: lv_divisor TYPE i VALUE 0.
DATA(lv_result) = COND i(
WHEN lv_divisor <> 0 THEN 100 / lv_divisor
ELSE THROW cx_sy_zerodivide( )
).

SWITCH – Value-Based Branching (like CASE)

The SWITCH expression compares a value against multiple possibilities.

Syntax

SWITCH <type>( <operand>
WHEN <value1> THEN <result1>
[ WHEN <value2> THEN <result2> ]
[ ELSE <default_value> ]
)

Examples for SWITCH

1. Simple SWITCH

DATA: lv_day TYPE i VALUE 3.
" Classic with CASE
DATA: lv_name TYPE string.
CASE lv_day.
WHEN 1. lv_name = 'Monday'.
WHEN 2. lv_name = 'Tuesday'.
WHEN 3. lv_name = 'Wednesday'.
WHEN OTHERS. lv_name = 'Unknown'.
ENDCASE.
" Modern with SWITCH
DATA(lv_name2) = SWITCH string( lv_day
WHEN 1 THEN 'Monday'
WHEN 2 THEN 'Tuesday'
WHEN 3 THEN 'Wednesday'
WHEN 4 THEN 'Thursday'
WHEN 5 THEN 'Friday'
WHEN 6 THEN 'Saturday'
WHEN 7 THEN 'Sunday'
ELSE 'Invalid'
).

2. SWITCH with Multiple Values per WHEN

DATA: lv_month TYPE i VALUE 7.
DATA(lv_season) = SWITCH string( lv_month
WHEN 3 OR 4 OR 5 THEN 'Spring'
WHEN 6 OR 7 OR 8 THEN 'Summer'
WHEN 9 OR 10 OR 11 THEN 'Autumn'
WHEN 12 OR 1 OR 2 THEN 'Winter'
ELSE 'Invalid month'
).

3. SWITCH for Status Codes

DATA: lv_status TYPE c LENGTH 1 VALUE 'A'.
DATA(lv_description) = SWITCH string( lv_status
WHEN 'A' THEN 'Active'
WHEN 'I' THEN 'Inactive'
WHEN 'P' THEN 'Pending'
WHEN 'C' THEN 'Completed'
WHEN 'X' THEN 'Cancelled'
ELSE 'Unknown'
).

4. SWITCH with Structures

TYPES: BEGIN OF ty_config,
color TYPE string,
size TYPE i,
enabled TYPE abap_bool,
END OF ty_config.
DATA: lv_mode TYPE string VALUE 'DARK'.
DATA(ls_config) = SWITCH ty_config( lv_mode
WHEN 'LIGHT' THEN VALUE #( color = 'white' size = 12 enabled = abap_true )
WHEN 'DARK' THEN VALUE #( color = 'black' size = 14 enabled = abap_true )
WHEN 'HIGH_CONTRAST' THEN VALUE #( color = 'yellow' size = 16 enabled = abap_true )
ELSE VALUE #( color = 'gray' size = 12 enabled = abap_false )
).

5. SWITCH for Enumerations

TYPES: BEGIN OF ENUM ty_order_status,
new,
processing,
shipped,
delivered,
cancelled,
END OF ENUM ty_order_status.
DATA: lv_status TYPE ty_order_status VALUE ty_order_status-shipped.
DATA(lv_icon) = SWITCH string( lv_status
WHEN ty_order_status-new THEN 'NEW'
WHEN ty_order_status-processing THEN 'PROCESSING'
WHEN ty_order_status-shipped THEN 'SHIPPED'
WHEN ty_order_status-delivered THEN 'DELIVERED'
WHEN ty_order_status-cancelled THEN 'CANCELLED'
).

6. SWITCH with THROW

DATA: lv_action TYPE string VALUE 'INVALID'.
DATA(lv_result) = SWITCH string( lv_action
WHEN 'CREATE' THEN 'Create'
WHEN 'UPDATE' THEN 'Update'
WHEN 'DELETE' THEN 'Delete'
ELSE THROW cx_parameter_invalid( parameter = 'ACTION' )
).

COND vs. SWITCH

AspectCONDSWITCH
ComparisonAny conditionsOne operand against values
Equivalent toIF…ELSEIF…ELSECASE…WHEN…ENDCASE
FlexibilityHigher (complex conditions)Simpler for value comparison
ReadabilityFor complex conditionsFor many individual values
" COND: For ranges and complex conditions
DATA(lv_category) = COND string(
WHEN lv_age < 18 THEN 'Child'
WHEN lv_age < 65 THEN 'Adult'
ELSE 'Senior'
).
" SWITCH: For discrete values
DATA(lv_day_name) = SWITCH string( lv_day_number
WHEN 1 THEN 'Monday'
WHEN 2 THEN 'Tuesday'
" ...
).

Nesting

DATA: lv_type TYPE string VALUE 'CUSTOMER',
lv_active TYPE abap_bool VALUE abap_true.
DATA(lv_label) = SWITCH string( lv_type
WHEN 'CUSTOMER' THEN COND #(
WHEN lv_active = abap_true THEN 'Active Customer'
ELSE 'Inactive Customer'
)
WHEN 'SUPPLIER' THEN COND #(
WHEN lv_active = abap_true THEN 'Active Supplier'
ELSE 'Inactive Supplier'
)
ELSE 'Unknown'
).

In Method Calls

" Directly as parameter
CALL METHOD lo_logger->log(
iv_level = COND #( WHEN lv_error = abap_true THEN 'ERROR' ELSE 'INFO' )
iv_message = |Status: { lv_status }|
).
" As return value
METHODS get_status_text
RETURNING VALUE(rv_text) TYPE string.
METHOD get_status_text.
rv_text = SWITCH #( mv_status
WHEN 'A' THEN 'Active'
WHEN 'I' THEN 'Inactive'
ELSE 'Unknown'
).
ENDMETHOD.

Important Notes / Best Practice

  • Use COND for range checks and complex conditions.
  • Use SWITCH for discrete value comparisons (like enums, status codes).
  • ELSE is optional – without ELSE, the initial value is returned when no match is found.
  • THROW allows raising exceptions as a result.
  • Combine with VALUE for structures and tables.
  • Avoid too deep nesting – use methods for complex logic.
  • # derives the type from the context (e.g., in assignments).
  • Use LET for local helper variables within the expression.