Skip to content
Advertisement

How to select numeric data of certain length

I am trying to select numeric data that is greater than 5 bytes. I have entered the below but get an error of ERROR: Function LENGTH requires a character expression as argument 1. Not sure what I am doing wrong. Any help would be greatly appreciated.

29         PROC SQL;
30            CREATE TABLE WORK.FILTER_FOR_FDRMASTER_DAILY__0000 AS
31            SELECT t1.Account_id_nr,
32                   t1.Predecessor_CC_SK,
33                   t1.Successor_CC_SK,
34                   t1.Related_CC_SK,
35                   t1.Original_CC_SK,
36                   t1.Predecessor_Argt_SK,
37                   t1.Successor_Argt_SK,
38                   t1.Predecessor_OK,
39                   t1.Successor_OK,
40                   t1.CHD_SSR_IN,
41                   t1.CHD_SYSTEM_BANK,
42                   t1.USAANR
43               FROM WORK.FILTER_FOR_FDRMASTER_DAILY_2 t1
44               WHERE t1.Successor_CC_SK NOT = . AND t1.CHD_SSR_IN = 'Y' AND t1.CHD_SYSTEM_BANK NOT BETWEEN '867700000100' AND
45                    '867700009500' AND LENGTH(t1.Successor_CC_SK) > '5'
46               ORDER BY t1.Successor_CC_SK;

Advertisement

Answer

Since you are dealing with both credit card numbers and 5-digit numbers, let’s assume that all of them could be stored in one of three formats:

Num:  1234567890123456
Char: 1234-5678-9012-3456
Char: 1234 5678 9012 3456

Let’s start with the first case, which assumes that the variable is numeric. You want to exclude all 5-digit values. You can use this trick by Rick Wicklin to count the number of digits in an integer:

proc sql noprint;
    create table want as
         select number
         from have
         where ceil(log10(number+1)) > 5
    ;
quit;

For the second and third cases, they’ll be stored as characters. You can count the number of numeric characters in a string using countc() with the D option.

proc sql noprint;
    create table want as
         select compress(number, ' -')
         from have
         where countc(number,'','D') > 5
    ;
quit;
User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement