我有一个工作多年的计划。今天,我们从SAS 9.4M3升级到9.4M7。
proc setinit
Current version: 9.04.01M7P080520从那以后,我无法获得与升级前相同的结果。
请注意,我正在直接查询Oracle数据库。
为了用一个最小的、可重复的SAS表示例来复制这个问题,我发现这个问题在查询SAS表而不是在Oracle数据库上时消失了。
假设我有以下数据集:
data have;
infile datalines delimiter="|";
input name :$8. id $1. value :$8. t1 :$10.;
datalines;
Joe|A|TLO
Joe|B|IKSK
Joe|C|Yes
;使用临时表:
proc sql;
create table want as
select name,
min(case when id = "A" then value else "" end) as A length 8
from have
group by name;
quit;
Results:
name A
Joe TLO但是,当直接在oracle数据库上运行相同的查询时,我会得到一个缺失的值:
proc sql;
create table want as
select name,
min(case when id = "A" then value else "" end) as A length 8
from have_oracle
group by name;
quit;
name A
Joe 根据文档,当在SAS表上使用时,min()函数运行正常。
-- MIN函数只有在所有参数都缺少时才返回缺少的值(.) 。
我相信,当Oracle不理解SAS传递它的函数时,就会发生这种情况-- SAS和Oracle中的min函数非常不同,在SAS中的等效函数是LEAST()。
因此,我的猜测是,升级将如何将SAS函数转换为Oracle,但这仍然是一个猜测。有人遇到过这种行为吗?
编辑:@Richard的评论
options sastrace=',,,d' sastraceloc=saslog nostsuffix;
proc sql;
create table want as
select t1.name,
min(case when id = 'A' then value else "" end) as A length 8
from oracle_db.names t1 inner join oracle_db.ids t2 on (t1.tid = t2.tid)
group by t1.name;
ORACLE_26: Prepared: on connection 0
SELECT * FROM NAMES
ORACLE_27: Prepared: on connection 1
SELECT UI.INDEX_NAME, UIC.COLUMN_NAME FROM USER_INDEXES UI,USER_IND_COLUMNS UIC WHERE UI.TABLE_NAME='NAMES' AND
UIC.TABLE_NAME='NAMES' AND UI.INDEX_NAME=UIC.INDEX_NAME
ORACLE_28: Executed: on connection 1
SELECT statement ORACLE_27
ORACLE_29: Prepared: on connection 0
SELECT * FROM IDS
ORACLE_30: Prepared: on connection 1
SELECT UI.INDEX_NAME, UIC.COLUMN_NAME FROM USER_INDEXES UI,USER_IND_COLUMNS UIC WHERE UI.TABLE_NAME='IDS' AND
UIC.TABLE_NAME='IDS' AND UI.INDEX_NAME=UIC.INDEX_NAME
ORACLE_31: Executed: on connection 1
SELECT statement ORACLE_30
ORACLE_32: Prepared: on connection 0
select t1."NAME", MIN(case when t2."ID" = 'A' then t1."VALUE" else ' ' end) as A from
NAMES t1 inner join IDS t2 on t1."TID" = t2."TID" group by t1."NAME"
ORACLE_33: Executed: on connection 0
SELECT statement ORACLE_32
ACCESS ENGINE: SQL statement was passed to the DBMS for fetching data.
NOTE: Table WORK.SELECTED_ATTR created, with 1 row and 2 columns.
! quit;
NOTE: PROCEDURE SQL used (Total process time):
real time 0.34 seconds
cpu time 0.09 seconds发布于 2021-12-22 13:59:53
为什么要使用' '或''作为其他值?也许Oracle对带有空格的字符串的处理方式与空字符串不同。
为什么不在clause子句中使用null呢?
或者干脆去掉off子句,让它默认为null。
libname mylib oracle .... ;
proc sql;
create table want as
select name
, min(case when id = "A" then value else null end) as A length 8
from mylib.have_oracle
group by name
;
quit;还可以尝试自己运行Oracle代码,而不是使用隐式pass。
proc sql;
connect to oracle ..... ;
create table want as
select * from connection to oracle
(
select name,
min(case when id = "A" then value else null end) as A length 8
from have_oracle
group by name
)
;
quit;https://stackoverflow.com/questions/70446875
复制相似问题