[thelist] Tip: SQL - Oracle: Selecting a character flag based on one (or more) of two fields not being null
Luther, Ron
Ron.Luther at hp.com
Wed Jun 26 11:05:01 CDT 2002
Hi Gang,
I've been busy playing 'catch-up' around here so I haven't been very vocal lately.
It may not be the most efficient solution, but here's a tip I came up with yesterday that someone else may find useful:
<tip type="SQL - Oracle: Selecting a character flag based on one (or more) of two fields not being null" author="RonL.">
Set-up: The client wanted a flag, (a capital "X"), to appear in a column in the result set if there was a date in field_1 or a date in field_2. If both fields are null, then the column should show a blank. If either field is not null, then the column should show an "X".
Solution: Select some_stuff, DECODE(NVL ( TO_CHAR(AL1.FIELD_1,'YYYY'), 'Z' ) || NVL( TO_CHAR(AL1.FIELD_2,'YYYY'),'Z'), 'ZZ', '','X'), some_more_stuff from tables where conditions order by desired_sort
Let's break that down:
The TO_CHAR(field,'YYYY') turns each date into a four digit character string, like '2002'.
The NVL(above, 'Z') turns each null value into a "Z".
So, at this point each date field is either a "Z" or a number-like string "2002".
The || concatenates the two string variables together. So we've either got "20022002", "Z2002", "2002Z", or "ZZ". [And we only get "ZZ" if both date fields were originally null.]
The DECODE(above, 'ZZ', '', 'X') turns any "ZZ" into a blank, and anything else into our "X" flag. [So if both dates were null we get a blank space, if either date (or both) have a value then we get our "X".]
<scratches head />Funny, it didn't seem so straight forward yesterday ...
Anyway, this can be extended to more than two fields through nesting and concatenation, but that would get even uglier!
</tip>
More information about the thelist
mailing list