从Oracle表中选择数据时遇到问题。一些值是R
,RJ
,依此类推。但是,当我运行以下查询时,我只会得到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
的条目。
如何在不修剪或压缩字符串的情况下解决此问题?
答案 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)。