Jim Essinger wrote:
I have a file that has bad data showing up in a field. The file
was created by a third party software vendor, and while we wait
for them to find and fix the problem, I need to find a way to
identify those records with invalid data, and replace that data
with zeros. I would like to do this with SQL if I can, but I
don't know how to test a numeric field for the hex value of
"40404040" or blanks. Better yet would be to test "Not numeric"
(I know that COBOL can do that test!).
Is there a way to test if a numeric field contains something
other than a number in SQL?
FWiW the following SQL was tested [only a retyped version was
validated; no copy\paste was available] using a four byte zoned
decimal numeric column, and the SELECT returned only the examples of
decimal data errors. Presumably this is no longer of any use for
the original request[er], but possibly of interest to someone for an
example on the technique & scalar functionss used. So, for the
archives...
<code>
/* given: Zcol NUMERIC (4, 0) & SRTSEQ(*HEX) */
/* select rows where Zcol has invalid zone decimal data */
/* include relative row number for reference */
/* include hex view of raw data for reference */
/* include Zcol [may show as '+'s in STRSQL report] */
/* include other columns; e.g. for [unique] key of row */
/* 013b x'F0F1F382' bad sign */
/* x'C6F0C6F1C6F3F8F2' */
/* 01c2 x'F0F183F2' bad zone */
/* x'C6F0C6F1F8F3C6F2' */
/* 01Ü2 x'F0F1FBF2' bad digit */
/* x'C6F0C6F1F5C2C6F2' */
select rrn(a), hex(Zcol), Zcol, a.*
from TheFile a
where
/* test zone portion of the sign digit */
( substr( hex(Zcol) , 7, 1 )
not between 'A' and 'F'
)
/* test zone portion of all non-sign digits */
or ( land( x'C600C600C600'
, substr( hex(Zcol) , 1, 6 ) )
<> x'C600C600C600'
)
/* test digit portion of all digits */
or ( translate(
replace(
land( x'00FF00FF00FF00FF'
, substr( hex(Zcol) , 1, 8 ) )
, x'00', ''
)
, ' ', '1234567890'
)
<> ''
)
</code>
To make the above request more generic, instead of specific to a
four digit zoned decimal, the substrings could be adjusted to have
the length be a derivation from the length of either the Zcol or
hex(Zcol), and the hex literals for the "logical and" [land] could
be generated with REPEAT() characters using similar derivations from
the length of the field; e.g. the literal six can be replaced by the
expression length(hex(Zcol))-2 and the literal x'C600C600C600' could
be replaced by the expression repeat(x'C600',length(hex(Zcol))/2-1)
or similarly repeat(x'C600',length(Zcol)-1).
Note that the interactive SQL feature did not diagnose [with plus
symbols] any examples whereby only non-sign zone portions of the
number were not valid; i.e. were not 0xF. At one time Query/400
would have diagnosed those conditions, but even that feature seems
no longer to do so; though they are the same report writer, only the
Query/400 asks\asked the database to "force conversion mapping" of
the numeric data to ensure numeric validation is done by the LIC DB.
Regards, Chuck
As an Amazon Associate we earn from qualifying purchases.