sql - 如何将此 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。
解决方案
假设基于 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
推荐阅读
- git - 从另一个人的叉子修改拉取请求
- r - 如何使用带有 dplyr 的管道将数据帧变量传递给 for 循环?
- git - 删除本地分支和主分支之间的公共文件并推送到新分支
- python - 为什么我的 python discord 命令不起作用?
- shadow-dom - 为什么 setTimeout 中的影子 DOM 事件会重新定位?
- jquery - 在进行快速编辑时更新 edit.php 表单上的自定义选择选项?
- raku - Raku 控制语句使数字字符串解释为数字
- maven - 使用maven打包多个jar
- reactjs - 重置后复选框无法正常工作
- c# - Dapper QueryMultipleAsync 忽略参数