Absolutely, but technically it's optional, you can both do a CASE without otherwise and an ICASE without a last return value.
I have many CASE statements covering all cases there are and just a comment in the OTHERWISE clause stating why there is no otherwise code. If you do a case on a logical field for .NULL., .T., and .F. there is no otherwise, for example, and I don't put any of these as OTHERWISE just to have an otherwise, such a case statement would have the cases I) ISNULL(x), II) x, and II) NOT x and no real otherwise. If the type ever changes, the whole code needs to change anyway.
So finally let me be picky now and warn about misusing OTHERWISE for the last logical case there is left. If you do that your CASE statement is really expecting a specific case in otherwise and that is not the meaning of it. If you have cases like product types, countries, anything that can be extended the otherwise clause can be used to cover non covered cases at least with a default code and may also log that there is the need to extend the case statement, true, but it's not your ELSE branch, that only ever applies to opposite conditions and a case statement is not about something or NOT something, it's about N cases.
In Saifs case (or should I say ICASE?) I would expect records without any unit and then an empty string would be good, too. Or other units need no translation, then the field itself untranslated would be a good value to return, eg [tt]ICASE( 'PCS' $ UPPER(field),'Pieces', 'SET' $ UPPER(field), 'Sets', field)[/tt].
ICASE returns .NULL. in case the otherwise value would be needed, eg ICASE(.F.,1,2) returns 2 and ICASE(.F.,1) returns .NULL., and so you'd have a problem if .NULL. is not accepted. Besides that, this could also be done with IIF, of course.
Bye, Olaf.