![]() |
|
Archives of the TeradataForumMessage Posted: Fri, 20 Jul 2007 @ 11:49:12 GMT
<-- Anonymously Posted: Thursday, July 19, 2007 22:32 --> I know this topic has been raised quite a few times but it was only recently that I've had it occur as a maintenance issue when I was asked to diagnose a failure in an overnight batch process. A production script failed because a tiny number of rows of alphabetic characters had been added to a 100 million row table. Suddenly a whole script failed because Teradata and/or SQL offers no safe way to convert text to numbers. Needing to react quickly and knowing I was dealing with a CHAR(2) column I wrote the following to replace the original simple CAST. I wanted something that could NOT produce a script halting error, i.e. no matter what other minor muck gets put into the column in future.
CAST(
( CASE
WHEN
SUBSTRING( DBN.TBN.CBN FROM 1 FOR 1)
IN (' ', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' )
AND
SUBSTRING( DBN.TBN.CBN FROM 2 FOR 1)
IN (' ', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' )
THEN
SUBSTRING( DBN.TBN.CBN FROM 1 FOR 2)
END
) AS BYTEINT )
I used the IN list rather than an ANSI/ASCII range just because I had it in my head to not presume anything about character encodings. My question then is: what would be a better way to write this? My idea of "better" here is: - more generically SQL rather than Teradata specific - impervious to changes in the CHARACTER type of the source column - applicable to more than just two character length strings (It was assuming a length of two let me avoid testing for spaces *inside* as there is no inside of a length 2 string.) I'm happy to presume only integer numbers. I'm not sure if I'd want to be proof against decimal points being in the string - obviously covering that would be better than not. UDFs are not an option! I need to supply SQL for use buried deep in INSERT statements inside long batch scheduled BTEQ scripts. btw, some may wonder that I didn't put efficiency in the definitions of "better". The answer is for a scheduled blind process I really don't care. Unless it will blow out INSERT time by a factor of 10 then I say let the machine crunch. I rather not ever ever have to debug this fault ever again.
| ||||||||||||||||||||||||||||||||||||||||||||||||
| | ||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||
| Copyright 2016 - All Rights Reserved | ||||||||||||||||||||||||||||||||||||||||||||||||
| Last Modified: 15 Jun 2023 | ||||||||||||||||||||||||||||||||||||||||||||||||