Logical-valued Data

SAS does not have a special “logical” data type: SAS only works with character and floating point numeric data. In SAS, logical values are handled as numeric data: 0, 1, or missing.

Important
  • where a SAS expression returns a logical value, it will be either 0 or 1.
  • where SAS evaluates a “logical” expression, it only assumes the data is numeric, treating 0 and missing data as false, and any other numeric value as true.

Logical Operators

SAS has the usual logical operators: AND, OR, and NOT. These many be written mnemonically or symbolically, e.g. AND or &.

Given the values 0 and 1, these behave as you expect. Notice in the following example that a missing value is equivalent to 0, a “false” value.

data logical;
  length operator $ 4;
  input x y;
    condition = x and y;
  operator = 'AND';
  output;
  condition = x or y;
  operator = 'OR';
  output;
  condition = not x;
  operator = 'NOT';
  output;
datalines;
1 1
1 0
1 .
0 .
. .
;
proc print data=logical noobs;
  where operator eq 'AND';
  var x operator y condition;
  run;
                      x    operator    y    condition

                      1      AND       1        1    
                      1      AND       0        0    
                      1      AND       .        0    
                      0      AND       .        0    
                      .      AND       .        0    
proc print data=logical noobs;
  where operator eq 'OR';
  var x operator y condition;
  run;
                      x    operator    y    condition

                      1       OR       1        1    
                      1       OR       0        1    
                      1       OR       .        1    
                      0       OR       .        0    
                      .       OR       .        0    
proc print data=logical noobs;
  where operator eq 'NOT';
  var operator x condition;
  run;
                        operator    x    condition

                          NOT       1        0    
                          NOT       1        0    
                          NOT       1        0    
                          NOT       0        1    
                          NOT       .        1    

Because these operators are acting on numeric values as inputs, you can also understand them to be checking if a value is 0 or missing (“false”), or not (“true”).

data logical;
  length operator $ 4;
  input x y;
    condition = x and y;
  operator = 'AND';
  output;
  condition = x or y;
  operator = 'OR';
  output;
  condition = not x;
  operator = 'NOT';
  output;
datalines;
5 -3
2.7 0
100 .
;
proc print data=logical noobs;
  where operator eq 'AND';
  var x operator y condition;
  run;
                     x      operator     y    condition

                     5.0      AND       -3        1    
                     2.7      AND        0        0    
                   100.0      AND        .        0    
proc print data=logical noobs;
  where operator eq 'OR';
  var x operator y condition;
  run;
                     x      operator     y    condition

                     5.0       OR       -3        1    
                     2.7       OR        0        1    
                   100.0       OR        .        1    
proc print data=logical noobs;
  where operator eq 'NOT';
  var operator x condition;
  run;
                      operator      x      condition

                        NOT         5.0        0    
                        NOT         2.7        0    
                        NOT       100.0        0    

Comparison Operators

SAS also has the usual comparison operators, , including the IN operator commonly found in data processing languages. These too may be written mnemonically or symbolically, e.g. ‘EQ’ or = (note this is a single equals symbol in SAS), LE or <=, etc. These may be used to compare numbers verus numbers or character strings versus character strings.

Missing Values

A special consideration is how SAS uses missing values in comparisons.

Missing values are the smallest values

In a comparison, SAS treats missing values as if they are simply the smallest possible numeric values. So . <= -100 is true!

Decimal Values

Comparisons of values that have decimal components can be problematic with any computer software (because the computation is actually done in binary).

data decimal;
  x = 0.2;
  y = 0.3 - 0.1;
    condition = (x = y);
    run;

proc print noobs; run;
                           x      y     condition

                          0.2    0.2        0    

Although we understand that \(0.2 = 0.3 - 0.1\) is true, when this expression is converted into binary, the numbers can no longer be represented in finite precision. The necessary rounding means these numbers are not exactly equal.

A better comparison these, it to check that the difference between these two numbers is “small enough” to be essentially zero. Use conditions of the form

x - y < 1e-16
data decimal;
  x = 0.2;
  y = 0.3 - 0.1;
    condition = (x - y < 1e-16);
    run;

proc print noobs; run;
                           x      y     condition

                          0.2    0.2        1    

See SAS’s discussion of numeric precision for more details.