SAS:选择结尾为空白的字符串

时间:2018-06-26 09:48:57

标签: string oracle sas

从Oracle表中选择数据时遇到问题。一些值是RRJ,依此类推。但是,当我运行以下查询时,我只会得到RJ

proc sql noprint;
    SELECT col
    FROM myoracletable
    WHERE col IN('R','RJ')
    ;
quit;

所以我在Oracle上检查了值R

select distinct rawtohex(col) as col
from myoracletable;

R的结果为5220。因此,字符串为R[blank]。我这样修改了SAS程序:

proc sql noprint;
    SELECT col
    FROM myoracletable
    WHERE col IN('R ','RJ','5220'x)
    ;
quit;

但是仍然没有选择带有R的条目。

如何在不修剪或压缩字符串的情况下解决此问题?

2 个答案:

答案 0 :(得分:1)

我无法在SAS本身中重现此行为:

data have;
input mystr :$2.;
cards;
R
RJ
;
run;

proc sql;
select mystr from have where mystr in ('R', 'RJ');
quit;

这将选择两个值。因此,一种选择可能是运行初始查询,以将Oracle表的一部分复制到SAS工作库中的临时数据集中,然后在该数据库上运行另一个查询。

如果使用传递查询来访问Oracle表,您也可能会得到不同的结果,但是我无法对其进行测试。

答案 1 :(得分:1)

SAS仅使用固定长度的字符串并去除末尾的空格以使其正常工作。因此,当SAS为您转换查询时,它似乎将'R'而不是'R '推送到数据库中。

您需要直接编写Oracle查询。因此,不要使用像这样的隐式语法:

libname myora oracle ... schema=myoraschema ... ;
proc sql ;
SELECT col
  FROM myora.mytable
  WHERE col IN('R ','RJ')
;

您应该使用像这样的显式语法:

libname myora oracle ..... ;
proc sql ;
connect using myora ;
select * from connection to myora 
(SELECT col
  FROM myoraschema.mytable
  WHERE col IN('R ','RJ')
 )
;

长期解决方案是将Oracle表修复为不存储尾随空白。您可能需要将变量重新定义为VARCHAR(2)而不是CHAR(2)。