【问题标题】:How to convert this SAS code to SQL Server code?如何将此 SAS 代码转换为 SQL Server 代码?
【发布时间】:2018-08-30 19:05:24
【问题描述】:

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。

【问题讨论】:

  • 请编辑您的问题并提供(1)样本数据; (2) 期望的结果; (3) 逻辑说明。人们在解释事物方面比代码做得更好。
  • 您好,欢迎来到该网站不幸的是,代码转换对于 Stack Overflow 来说是题外话。请尝试解决问题,然后提出与该尝试相关的问题。谢谢!
  • 您使用的是什么 SQL 语言?功能和操作各不相同,因此您需要提供。不过,对于上下文,FINDC 只是查找这些字符,COUNTC 计算这些字符。它返回/& 的第一个位置,因此您可能需要使用两个CHARINDEX 函数而不是一个,并取两者之间的最小值来找到最早出现的位置。可能有更适合的不同功能,但我们需要知道您的 RDBMS 才能回答这个问题。
  • 我在标题中写到我正在使用SQL server。我在 Aginity Workbench (Netezza) 中运行它。
  • 您能解释一下为什么该代码不起作用吗?它编译了吗? (如果没有,你得到了什么错误?)它运行了吗? (如果没有,你得到了什么错误?)它炸毁了你的电脑吗? (如果有,你有视频吗?)

标签: sql sas


【解决方案1】:

假设 Oracle 基于 CHARINDEX() 这可能有效: 您需要应用它两次,每个字符一次,并取最小值以找到第一次出现。 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

【讨论】:

  • 我刚刚运行了这段代码,得到一个错误,提示“charindex 不存在,无法找到满足给定参数类型的函数。您可能需要添加显式类型转换'
  • 我已对此进行了编辑以反映 netezza,但仍不确定这是您的数据库。如果这不起作用,您需要明确说明服务器类型和版本,以确保获得正确的功能。
【解决方案2】:

FINDC & COUNTC 函数主要用于搜索字符和计数。

您可以使用 SQL 中的LIKE 运算符来查找带有“%”和“_”通配符的字符

例如-

SELECT * FROM <table_name> WHERE <column_name> LIKE '%-%';

SELECT COUNT(*) FROM <table_name> WHERE <column_name> LIKE '%-%';

您也可以在LIKE 运算符中使用正则表达式

【讨论】:

  • 感谢您的回答。我不想单独为上面的 _sep1 字段创建一个完整的选择语句,我想将 _sep1、_count1 等包含为另一个选择语句的一部分的字段。例如:select *, charindex('/&,',pol_no) as _sep1, LEN(pol_no) - LEN(REPLACE(pol_no,'/&,','')) as _count1 from table
  • 您的问题没有这些详细信息。您可以根据需要在 SQL 查询中进行子查询或多列选择。
猜你喜欢
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 2019-05-26
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多