I am using PHP to generate a SQL query that needs to be ordered in a custom way. I am generating a CASE
block with a number of WHEN
statements that assign a number ranking. The WHEN
statements that are included are contingent on how much information I have available for querying. For example, if I have a phone available, I will generate three WHEN
statements:
WHEN phone = '(202) 555-5555' AND last_name = 'Smith' and first_name = 'John' THEN 1
WHEN phone = '(202) 555-5555' AND last_name = 'Smith' THEN 2
WHEN phone = '(202) 555-5555' THEN 3
So I am ranking based on how close the match is, and I am valuing the parameters the same (a match on phone, first name, and last name should be ranked on the same tier as a match on address, first name and last name). However, after generating these statements for multiple pieces of information (phone, address, etc), my WHEN
statements will be all out of order; the THEN 1
terminated clauses will be separated from each other, same for THEN 2
and so on. I could put them in order, but that would make my PHP more verbose and ugly.
TL;DR?
So the short question is: Does the order of the WHEN
statements in a CASE
statement matter? Does SQL (I'm using Oracle) go with the first match or does it evaluate all of the possibilities and assign the highest ranking?
Yes, the order of the case statements does matter. The first matching row will be the one returned.
So, this statement:
(CASE WHEN phone = '(202) 555-5555' AND last_name = 'Smith' and first_name = 'John' THEN 1
WHEN phone = '(202) 555-5555' AND last_name = 'Smith' THEN 2
WHEN phone = '(202) 555-5555' THEN 3
END)
Could return 1, 2, or 3 (or NULL
). The following will always return 3 (or NULL
) because the last two conditions will never be processed:
(CASE WHEN phone = '(202) 555-5555' THEN 3
WHEN phone = '(202) 555-5555' AND last_name = 'Smith' THEN 2
WHEN phone = '(202) 555-5555' AND last_name = 'Smith' and first_name = 'John' THEN 1
END)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With