Извлечение буквенно-цифровой последовательности SAS/PROC SQL

Я конвертирую часть своего кода R в SQL PROC для программы в SAS EG (V8.3.2.140), но застрял. Мне нужна помощь в извлечении буквенно-цифровой строки из столбца и создании нового столбца с этой буквенно-цифровой строкой.

В R я использую пакет rebus для создания шаблонов, а затем использую mutate/str_extract, чтобы поместить его в новый столбец.

Узор выглядит следующим образом:

c(
  
    optional(ALPHA) %R%  
    
    ALPHA %R%
    
    ALPHA %R% 
    
    DGT %R% 
    
    DGT %R% 
    
    ALPHA %R% 
    
    ALPHA %R% 
    
    optional(ALPHA) %R%
    
    DGT %R% 
    
    optional(DGT) %R% 
    
    optional(ALPHA)
  
  )

Таким образом, необязательный символ, за которым следует символ, за которым следует символ, за которым следуют цифры и т. д. Это будет выглядеть так: ABC01DE02 или ABC01DE02A. Мне нужны обе версии.

Положение буквенно-цифрового кода в строке, из которой я пытаюсь его извлечь, может варьироваться, поэтому использование этой позиции не сработает. Однако символы всегда будут заглавными буквами.

Надеюсь, это предоставит достаточно информации для решения.

Какое отношение SQL имеет к этому вопросу?

Tom 18.06.2024 20:26
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это похоже на работу для регулярного выражения. Приведенное ниже регулярное выражение должно сделать это на основе вашего кода и описания:

[A-Z]{0,3}\d{2}[A-Z]{2,3}\d{1,2}[A-Z]

тест regex101.com

Вы захотите сделать это с помощью шага данных, а не SQL:

data want;
    length string $25.;
    input string$;
   
    /* Calculate the regex id only once */
    retain regexid;

    if (_N_ = 1) then 
        regexid = prxparse('/[A-Z]{0,3}\d{2}[A-Z]{2,3}\d{1,2}[A-Z]?/');

    /* If a match is found, extract the string:
       1. Get the position and length of the match
       2. Extract the match by position and length */
    if (prxmatch(regexid, string)) then do;
        call prxsubstr(regexid, string, pos, len);
        extract = substr(string, pos, len);
    end;

    drop pos len regexid;

    /* In-line sample data */
    datalines;
KJ3828ADIJABC01DE02292LZ
FJS9EO2ABC01DE02A92UJDDA
;
run;
string                      extract
KJ3828ADIJABC01DE02292LZ    ABC01DE02
FJS9EO2ABC01DE02A92UJDDA    ABC01DE02A

Другие вопросы по теме