Обсуждение неожиданных результатов оценки относится к коду, выполненному в SAS 9.4 TS1M4 в Windows 10.0.17763, сборка 17763.
3 proc options;
4 run;
SAS (r) Proprietary Software Release 9.4 TS1M4
В SQL отсутствует концепция отсутствующего значения (.
, .<letter>
), как в DATA Step и других процессах. SQL имеет NULL, а SAS принудительно пропускает значения в NULL, поэтому существует нечеткое ребро, и вы обнаружили там проблему!
Похоже, что неправильная оценка выражения заключается в том, как реализация 9.4 SQL обрабатывает пропущенные литеральные (.
) значения в данном конкретном случае. Ошибка не в IFN
, а в оценке, переданной IFN
!
Изучение только логического выражения проблем, похоже, не связано с IN
. Подобные неожиданные результаты оценки возникают, когда IN
разбивается на серию OR
с. Конкретная причина заключается в том, что в выражении появляется отсутствующий литерал (.
), который в свою очередь становится 9.4 внутренними реализациями SQL (анализ и т. Д.)
Определенно кажется ошибкой, когда более двух подвыражений и одно из них использует пропущенное (.
). Надлежащим средством, которое станет более подходящим для удаленной или сквозной обработки, будет исключение использования отсутствующих литералов (.
) в вашем SQL и использование операторов нулевых тестов ANSI IS NULL
и IS NOT NULL
data have;
b = 9.1;
run;
proc sql;
create table want as
select
b
, b in (.,0) | b > 100 as part1 /* correct result */
, b in (.,0) | b < 1 as part2 /* correct result */
, b > 100 | b < 1 as part3 /* correct result */
, b in (.,0) | b > 100 | b < 1 as parts_null_first /* INCORRECT result */
, b > 100 | b < 1 | b in (.,0) as parts_null_last /* INCORRECT result */
, b=. | b=0 | b > 100 | b < 1 as parts_no_in_null_first /* INCORRECT result */
, b=0 | b > 100 | b < 1 | b= . as parts_no_in_null_last /* correct - weird? */
, b is null | b=0 | b > 100 | b < 1 as parts_is_null /* correct result */
, calculated part1 | calculated part2 | calculated part3 as calc_parts_in_1_expr /* correct result */
from have
;
quit;
Я не проверял, возникает ли такая же проблема, когда проблемное выражение находится в каллусе WHERE
. Выражение не является проблемой в качестве присваивания на шаге DATA:
data want2;
set have;
parts_null_first = b in (.,0) | b > 100 | b < 1 ; /* correct result */
parts_null_last = b > 100 | b < 1 | b in (.,0); /* correct result */
run;
Если в выражениях «где» выражения возникает «ошибка» выражения, то механизм оценки «где» является более вероятной основной причиной - я считаю, что этот же механизм используется для операторов Proc / Data WHERE, Dataset WHERE = опция и SQL-вычислений.
Может быть SAS Note или Hotfix для ситуации, но я не пошел искать.
Еще одно обсуждение проверки пропущенных значений можно найти в SAS_Tipster: "Совет SAS: используйте IS MISSING и IS NULL с числовыми или символьными переменными" на community.sas.com. Важным недостатком является использование операторов в тестировании критериев для нулевых значений.
Операторы IS MISSING и IS NULL, которые используются с оператором WHERE, могут обрабатывать символьные или числовые переменные. Они также работают с оператором NOT:
Документация Суммирует IS MISSING predicate
как:
Проверка отсутствия значения SAS в собственном хранилище данных SAS.