Функция индекса SAS - Поиск одного столбца с использованием значений из другого - PullRequest
0 голосов
/ 31 октября 2019

Я сталкиваюсь с проблемой при использовании функции индекса для возврата позиции строки в строке.

Итак, у меня есть концентрированный список фамилий:

SMITH|JONES|DONALD

И я хочу найти позицию строки, на которую ссылаются из другого столбца (SurnametoFind), поэтому:

index(Surnames,'SMITH')

Работает отлично, однако, когда я ссылаюсь на столбец, я хочу использовать значение для поиска по (список отдельных фамилий, которые содержат SMITH в одной из строк):

index(Surnames,SurnametoFind)

Возвращает 0.

Это в рамках процедуры SQL, поэтому я также попытался использовать подстановочные знаки (в случае индексатакие функции, как PATINDEX на SQL Server):

index(Surnames,'%'||SurnametoFind||'%')

Но это также возвращает ноль.

Я что-то упускаю из-за того, как в функции индекса следует ссылаться на столбец SurnametoFind?

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Основная проблема заключается в том, что вы не учли тот факт, что SAS хранит символьные переменные фиксированной длины. Таким образом, если SurnametoFind достаточно долго, чтобы хранить «DONALD», тогда, когда значение «SMITH», по крайней мере один пробел после H. Таким образом, строка «SMITH» не найдена в строке «SMITH | JONES | DONALD».

Вы можете использовать функцию TRIM () для удаления пробных пробелов.

index(Surnames,trim(SurnametoFind))

Но поскольку ваш список разделен, вы, вероятно, захотите использовать функцию FINDW(). При этом вы можете сказать, какие символы разделяют слова в строке, в которой выполняется поиск. У него также есть модификаторы, которые позволят вам сказать, что он выполняет обрезку (и другие функции) за вас.

findw(Surnames,SurnametoFind,'|','t')
0 голосов
/ 31 октября 2019

Вам необходимо обрезать заготовки от SurnametoFind. Или используйте функцию НАЙТИ с опцией T, возможно, захотите также использовать опцию I.

1    data _null_;
2       input Surnames :$20. SurnametoFind:$20.;
3       put (s:)(=);
4       x1 = index(surnames,surnametofind);
5       x2 = index(surnames,trim(surnametofind));
6       x3 = find(surnames,surnametofind,'IT');
7       put (x:)(=);
8       cards;

Surnames=SMITH|JONES|DONALD SurnametoFind=SMITH
x1=0 x2=1 x3=1
Surnames=SMITH|JONES|DONALD SurnametoFind=Smith
x1=0 x2=0 x3=1
...