Proc SQL, где вычисляемое значение начинается с

#sas

Вопрос:

Я пишу proc sql заявление, в котором я хотел бы добавить подмножество в записи, в которых какое-то значение начинается с '3' символа или '1' при сопоставлении с символом (я объединяю несколько наборов данных, некоторые из которых имеют числовые кодировки, а некоторые используют кодировку символов.) Данные загружаются из sas7bdat файлов libname , на которые ссылается инструкция.

Я думаю, что знаю, как сделать каждое из них отдельно в строке SQL where, но я не знаю, как сделать их вместе:

 where VALUE like '3%'
where VALUE in ('3', '1')
where VALUE in (3, 1)
 

Но я не уверен, как сделать так, чтобы я сопоставлял тип dtype символов, а затем устанавливал оба флажка, начиная с '3' или '1' . Я верю, что есть какой-то способ вычислить значение в вызове, но я не знаю, как преобразовать его в символ.

Где VALUE строка, она состоит из двух символов. Если это целое число, то это число никогда не содержит более двух цифр, а значения варьируются от 1 до 99.

Комментарии:

1. Не можете ли вы просто исправить причину, по которой исходные наборы данных определяют переменную как разные типы, прежде чем пытаться их использовать? Например, вы используете импорт PROC для создания наборов данных из текстовых файлов вместо написания собственного кода шага обработки данных?

2. О, наборы данных уже представлены в виде sas7bdat файлов, я ссылаюсь на них с помощью libname шага

3. Итак, являются ли значения допустимыми целыми числами, даже если они являются символьной строкой? Они имеют длину менее 16 цифр? Если нет, то ваши числовые переменные, возможно, уже потеряли ключевую информацию. Всегда ли у них одинаковое количество цифр? Вы хотите выбрать только первую цифру (самую значимую цифру, если это число)?

4. Они являются допустимыми целыми числами, когда они числовые; Я просто хочу выбрать первый символ в идентификаторе.

Ответ №1:

Вы пробовали использовать оператора двоеточия?

 where VALUE in: (3, 1)
 

Ответ №2:

Вы можете использовать функцию PUT () или PUTN () для преобразования чисел в строку. Вы либо используете модификатор-L в формате, либо просто функцию LEFT() или STRIP (), чтобы удалить начальные пробелы из результата.

    create table want as 
     select * from (

   select put(num_id,10.-L) as id 
        , ....
   from ds1
   union 
   select char_id as id
        , ...
   from ds2
     
     )
     where char(id,1) in ('1','3')
   ;
 

Комментарии:

1. Если бы у меня было это в макросе, есть ли способ, который принимал бы как символьные, так и целочисленные входные данные, сопоставляющие их с символами?

2. Конечно. Первый шаг-узнать тип переменной, чтобы макрос мог сгенерировать соответствующий код на основе этого типа. Поэтому либо попросите макрос принять эту информацию в качестве входных данных, либо попросите его разобраться в этом. Например, вот служебный макрос, который вы можете использовать для проверки типа переменной в наборе данных. github.com/sasutils/macros/blob/master/varexist.sas