首页 > 解决方案 > 如何将此 SAS 代码转换为 SQL Server 代码?

问题描述

SAS 代码:

data table1;
set table2;
_sep1 = findc(policynum,'/&,'); 
_count1 = countc(policynum,'/&,');

_sep2 = findc(policynum,'-');   
_count2 = countc(policynum,'-');

_sep3 = findc(policynum,'_*');  
_count3 = countc(policynum,'_*'); 

如何将其转换为如下选择语句:

select 
    *,
    /*Code converted to SQL from above*/
from table2

例如,我尝试了以下代码:

select 
    *,
    charindex('/&,',policynum) as _sep1,                            
    LEN(policynum) - LEN(REPLACE(policynum,'/&,','')) as _count1

from table2

但我得到一个错误 42S02:函数 'CHARINDEX(UNKNOWN, VARCHAR)' 不存在。无法识别满足给定参数类型的函数。您可能需要添加显式类型转换。

请注意,变量 pol_no 是:'character varying(50) not null'。

我正在使用 Aginity Workbench for Netezza 运行它。我相信这是IBM。

标签: sqlsas

解决方案


假设基于 CHARINDEX() 的 Oracle 这可能有效:您需要应用它两次,每个字符一次,并取最小值以找到第一次出现。Oracle 中可能有更适合的功能,但我不知道如何推荐一个。

select 
    *,
    min(charindex('/',policynum), charindex('&', policynum)) as _sep1                            
    from table2

编辑:基于 OP 注释。

Netezza 看起来像 IBM,这意味着使用 INSTR 函数,而不是 CHARINDEX。

select 
    *,
    min(instr(policynum, '/'), instr(policynum, '&')) as _sep1
 from table2

https://www.ibm.com/support/knowledgecenter/en/SSGU8G_12.1.0/com.ibm.sqls.doc/ids_sqs_2336.htm


推荐阅读