我想找到“rsp_ver”以2.0或更高而不是1.0开头的情况。我想我可以在where子句中使用条件来查找子查询找到的带有“1.0”的rsp_ver代码的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
答案 0 :(得分:1)
假设rsp_ver
始终采用[主要版本]。[其他版本信息]的格式,您可以替换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或更高版本的行。
当您的版本号超过一位小数(即2.0.1)时,这比将rsp_ver
简单地转换为数值更有好处。缺点是它只检查当前形式的主要版本。
如果您需要更精细地过滤,可以创建一个Common Table Expression,从rsp_ver
列中选择不同的版本部分以及indv_id
,然后加入那个问题。
答案 1 :(得分:0)
从'
子句中删除Where
,以便将列比较为number
而不是字符串
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;