0

我想找到“rsp_ver”以 2.0 或更高版本而不是 1.0 开头的情况。我想我可以在 where 子句中使用条件来找出子查询找到的 rsp_ver 代码超过“1.0”的 ID:

select 
  trim(INS.fst_name) || '  ' || Trim(INS.lst_name) as name,
  IDS.rin,
  RSP.unit_id,
  RSP.indv_id,
  RSP.rsp_id,
  RSP.rsp_sqnm,
  RSP.rsp_ver,
  cast(RSP.post_ts as char(16)) as Post,
  RSP.post_audit_id
from 
  dhsdb2.wvs_rsp RSP
  join dhsdb2.indv_name_srch INS on RSP.indv_id = INS.indv_id
  join dhsdb2.indv_demg_srch IDS on RSP.indv_id = IDS.indv_id
where 
  RSP.indv_id in 
    (select 
       SRSP.indv_id 
     from 
       dhsdb2.wvs_rsp SRSP 
     where 
       SRSP.indv_id = RSP.indv_id and
       SRSP.rsp_ver > '1.0')
  and rsp.clse_ts is null 
order by
  RSP.rsp_ver;

这当然行不通。然后我想我需要那个内部查询来拥有 min 函数,但我跑了 int

4

2 回答 2

1

假设rsp_ver始终采用 [Major Version].[Other Version Info] 的格式,您可以替换 where 子句中的嵌套选择:

RSP.indv_id in 
    (select 
       SRSP.indv_id 
     from 
       dhsdb2.wvs_rsp SRSP 
     where 
       SRSP.indv_id = RSP.indv_id and
       SRSP.rsp_ver > '1.0')

具有以下内容:

CAST(SUBSTRING(RSP.rsp_ver, 1, CHARINDEX('.', RSP.rsp_ver)-1) AS INT) >= 2

这会从您的rsp_var列中获取主要版本部分,将其转换为INT,然后仅返回主要版本为 2 或更高版本的行。

rsp_ver当您拥有多于一位小数的版本号(即 2.0.1)时,这比简单地转换为数值有好处。缺点是它只检查当前形式的主要版本。

如果您需要更精细地过滤,您可以创建一个公用表表达式rsp_ver,从列中选择不同的版本部分indv_id,然后加入该查询。

于 2013-04-15T17:55:13.987 回答
0

'从子句中删除Where,以便将列作为 anumber而不是字符串进行比较

select 
  trim(INS.fst_name) || '  ' || Trim(INS.lst_name) as name,
  IDS.rin,
  RSP.unit_id,
  RSP.indv_id,
  RSP.rsp_id,
  RSP.rsp_sqnm,
  RSP.rsp_ver,
  cast(RSP.post_ts as char(16)) as Post,
  RSP.post_audit_id
from 
  dhsdb2.wvs_rsp RSP
  join dhsdb2.indv_name_srch INS on RSP.indv_id = INS.indv_id
  join dhsdb2.indv_demg_srch IDS on RSP.indv_id = IDS.indv_id
where 
  RSP.indv_id in 
    (select 
       SRSP.indv_id 
     from 
       dhsdb2.wvs_rsp SRSP 
     where 
       DRSP.indv_id = RSP.indv_id and
       SRSP.rsp_ver > 1.0)
  and rsp.clse_ts is null 
order by
  RSP.rsp_ver;
于 2013-04-15T17:46:53.320 回答