How to do a single line If statement in VBScript for Classic-ASP?

47,097

Solution 1

The conditional ternary operator doesn't exist out of the box, but it's pretty easy to create your own version in VBScript:

Function IIf(bClause, sTrue, sFalse)
    If CBool(bClause) Then
        IIf = sTrue
    Else 
        IIf = sFalse
    End If
End Function

You can then use this, as per your example:

lunchLocation = IIf(dayOfTheWeek = "Tuesday", "Fuddruckers", "Food Court")

The advantage of this over using a single line If/Then/Else is that it can be directly concatenated with other strings. Using If/Then/Else on a single line must be the only statement on that line.

There is no error checking on this, and the function expects a well formed expression that can be evaluated to a boolean passed in as the clause. For a more complicated and comprehensive answer see below. Hopefully this simple response neatly demonstrates the logic behind the answer though.

It's also worth noting that unlike a real ternary operator, both the sTrue and sFalse parameters will be evaluated regardless of the value of bClause. This is fine if you use it with strings as in the question, but be very careful if you pass in functions as the second and third parameters!

Solution 2

VBScript does not have any ternary operator.
A close solution in a single line and without using a user defined function, pure VBScript:

If dayOfTheWeek = "Tuesday" Then lunchLocation = "Fuddruckers" Else lunchLocation = "Food Court"

BTW, you can use JScript in Classic ASP if ternary opertor is so important to you.

Solution 3

edited 2017/01/28 to adapt to some of the non boolean condition arguments

Note: If all you need is to select an string based on an boolean value, please, use the code in the Polinominal's answer. It is simpler and faster than the code in this answer.

For a simple but more "flexible" solution, this code (the original code in this answer) should handle the usual basic scenarios

Function IIf( Expression, TruePart, FalsePart)
Dim bExpression
    bExpression = False 
    On Error Resume Next
    bExpression = CBool( Expression )
    On Error Goto 0
    If bExpression Then 
        If IsObject(TruePart) Then 
            Set IIf = TruePart
        Else 
            IIf = TruePart
        End If 
    Else
        If IsObject(FalsePart) Then 
            Set IIf = FalsePart
        Else 
            IIf = FalsePart
        End If 
    End If 
End Function 

If uses the Cbool function to try to convert the passed Expression argument to a boolean, and accepts any type of value in the TrueValue and FalseValue arguments. For general usage this is fast, safe and fully complies to documented VBScript behaviour.

The only "problem" with this code is that the behaviour of the CBool is not fully "intuitive" for some data types, at least for those of us that constantly change between vbscript and javascript. While numeric values are coherent (a 0 is a False and any other numeric value is a True), non numeric types generate a runtime error (in previous code handled as false), except if it is a string with numeric content or that can be interpreted as true or false value in english or in the OS locale.

If you need it, a VBScript version "equivalent" to the ? javascript ternary operator is

Function IIf( Expression, TruePart, FalsePart )
Dim vType, bExpression 

    vType = VarType( Expression )
    Select Case vType
        Case vbBoolean                : bExpression = Expression 
        Case vbString                 : bExpression = Len( Expression ) > 0
        Case vbEmpty, vbNull, vbError : bExpression = False
        Case vbObject                 : bExpression = Not (Expression Is Nothing)
        Case vbDate, vbDataObject     : bExpression = True
        Case Else
            If vType > 8192 Then 
                bExpression = True
            Else
                bExpression = False 
                On Error Resume Next
                bExpression = CBool( Expression )
                On Error Goto 0
            End If 
    End Select 

    If bExpression Then 
        If IsObject( TruePart ) Then 
            Set IIf = TruePart
        Else 
            IIf = TruePart
        End If 
    Else
        If IsObject( FalsePart ) Then 
            Set IIf = FalsePart
        Else 
            IIf = FalsePart
        End If 
    End If 
End Function 

BUT independently of the version used, be careful, you are calling a function, not using a ternary operator. Any code, or function call you put in TruePart of FalsePart WILL BE EXECUTED independently of the value of the condition. So this code

value = IIf( 2 > 3 , DoSomething(), DontDoSomething() )

WILL EXECUTE the two functions. Only the correct value will be returned to value var.

Solution 4

There's a weird trick possible (hi, Python!) for exact one-liner:

lunchLocation = array("Food Court", "Fuddruckers")(-(dayOfTheWeek = "Tuesday"))

The "magic" works because of a boolean operation specifics in VBScript. True is actually -1 and False is 0, therefore we can use it as an index for array (just get rid of a minus). Then the first item of array will be a value for False condition and second item for True.

Solution 5

related to @MC_ND answer:

to execute only one function, you can do something like that:

If VarType(TruePart) = vbString and InStr(1,TruePart,"function:") = 1 then
  IIf = GetRef(Mid(TruePart,10))()
Else
  IIf = TruePart
End If

the same for the FalsePart, and call IIf() it like that:

value = IIf( 2 > 3 , "function:DoSomething", "function:DontDoSomething" )

and will call DoSomething() or DontDoSomething()

Share:
47,097
Max
Author by

Max

Updated on September 13, 2020

Comments

  • Max
    Max over 3 years

    The "single line if statement" exists in C# and VB.NET as in many other programming and script languages in the following format

    lunchLocation = (dayOfTheWeek == "Tuesday") ? "Fuddruckers" : "Food Court";
    

    does anyone know if there is even in VBScript and what's the extact syntax?

  • user66001
    user66001 over 8 years
    Very handy "be careful" note. Was wondering why on earth my script was appearing to be going against logic.
  • Mike Q
    Mike Q over 3 years
    I can't imagine why one would complicate code in such a way ..
  • Captain Jack Sparrow
    Captain Jack Sparrow almost 3 years
    I can't imagine why VBScript was ever created