Вместо того, чтобы загрязнять ваш код критериями фильтрации, рассмотрите возможность помещения подобных целей в отдельную таблицу поиска.Одна из форм проверки значения на наличие или отсутствие присутствия в таблице поиска называется экзистенциальным суб-выбором.
Большинство целей имеют «содержащую» природу, как указано в %<target>%
, а некоторые не имеют подстановочных знаков, таких как 'SI'
, 'HI'
, которые должны точно соответствовать по порядкудля фильтрации.
Если все элементы действительно соответствуют «содержащему» типу соответствия, просто укажите целевые значения в таблице поиска и добавьте скобку %
к коду в запросе дополнительного выбора.Если вы хотите иметь все разновидности одинаковых совпадений (начинаются с <target>%
, заканчиваются %<target>
или содержат %<target>%
, цели поиска должны будут включать подстановочные знаки.
Например, экзистенциальный запроспроверяет все фильтры причины из-за NOT EXISTS . Если выражение фильтра не соответствует причине, будет выбрана запись.
data reason_like_filter;
input;
expression = _infile_;
datalines4;
%asth%
%asthma%
%asthma/%
%suicidal%
%assualt%
%assult%
%APA%
%legal%
%suicide%
ASA
/ASA
%SI/%
%SI, attempt%
%SI w%
SI
HI
%homicide%
%psyc%
%psch%
%FD-12%
%behavior%
%behav%
%overdose%
%agitation%
%aggression%
%psy eval%
;;;;
data ed_tat;
pt_acuity = 'AABB3DDEE';
track_group = 'Regional ED Tracking base';
length pid 8 reason_for_visit $50;
input pid reason_for_visit;
infile cards dsd dlm=',';
datalines;
1, "Suicide"
2, "Suicidal"
3, "Psy eval mm//dd/yy"
4, "Drop off cookies"
5, "Visit friend"
6, "Heart attack"
run;
proc sql;
create table want as
select *
, (
select count(*)
from reason_like_filter FILTER
where upcase(REASON_FOR_VISIT) LIKE upcase(FILTER.expression)
) as N
from ED_TAT
where
Pt_Acuity like '%3%'
AND TRACK_Group like '%ED Tracking%'
AND NOT EXISTS (
select *
from reason_like_filter FILTER
where upcase(REASON_FOR_VISIT) LIKE trim(upcase(FILTER.expression))
)
;
quit;