У меня есть небольшой запрос при подобном условии:
proc sql;
create table test as
select *
from Outlier_32
where
DX1 like between 'B0%' and 'C10' or
DX2 like between 'B0%' and 'C10' or
DX3 like between 'B0%' and 'C10' or
DX4 like between 'B0%' and 'C10'
;
quit;
По сути, у меня есть диапазон диагностики, и я хочу отфильтровать (фильтровать?) данные во всех 4 столбцах dx.





Вы не можете использовать несколько условных операторов SQL like & beteewn в одном условном выражении DX1 like between 'B0%' and 'C10'.
Означает =,<>,like,between условные операторы SQL, вы должны использовать по одному ' Example: WHERE(DX1 LIKE 'B0%' OR DX1 BETWEEN 'B0' AND 'C10').
Нравится — это оператор подстановки, используемый для фильтрации данных столбца по шаблону.
WHERE CustomerName LIKE 'a%' Finds any values that start with "a"
WHERE CustomerName LIKE '%a' Finds any values that end with "a"
WHERE CustomerName LIKE '%or%' Finds any values that have "or" in any position
WHERE CustomerName LIKE 'r%' Finds any values that have "r" in the second position
WHERE CustomerName LIKE 'a%_%' Finds any values that start with "a" and are at least 3 characters in length
WHERE ContactName LIKE 'a%o' Finds any values that start with "a" and ends with "o"
Я не уверен в типе данных и значениях в вашем столбце DX1, DX2; но что касается вопроса к filter data by range, вы можете использовать оператор between.
WHERE DX1 BETWEEN 'B00' AND 'C10'
AND DX2 BETWEEN 'B00' AND 'C10'
AND DX3 BETWEEN 'B00' AND 'C10'
AND DX4 BETWEEN 'B00' AND 'C10';
Операции нет like between. Вы можете использовать усеченные сравнения. Модификатор двоеточия после того, как оператор указывает SAS сравнивать только до длины более короткого аргумента. Обратите внимание, что нет необходимости использовать SQL для чего-то, что может сделать простой шаг данных.
data test ;
set Outlier_32 ;
where (DX1 >=: 'B0' and DX1 <= 'C10')
or (DX2 >=: 'B0' and DX2 <= 'C10')
or (DX3 >=: 'B0' and DX3 <= 'C10')
or (DX4 >=: 'B0' and DX3 <= 'C10')
;
quit;
В качестве альтернативного критерия выбора можно использовать сопоставление шаблонов регулярных выражений Perl с конкатенацией переменных диагностического кода. Роль конкатенации такая же, как or тестирование отдельных переменных.
where prxmatch ('/(B|C)0/', cats(dx1,dx2,dx3,dx4))
В более широком и долгосрочном смысле эпидемиологического исследования вы можете рассмотреть возможность использования онтологической таблицы, которая сопоставляет коды диагноза с кластером заболеваний или категорией исследования.
dx category
--- --------
B00 Foo
…
B99 Foo
C00 Foo
…
C09 Foo
dx будет внешним ключом к основному списку всех диагностических кодов.
Тогда критерии выбора SQL-запроса будут включать наличие коррелированного совпадения подзапроса.
where
exists (select * from ontology where category = 'Foo' and dx1 = dx) or
exists (select * from ontology where category = 'Foo' and dx2 = dx) or
exists (select * from ontology where category = 'Foo' and dx3 = dx) or
exists (select * from ontology where category = 'Foo' and dx4 = dx)