Sql 基于列值更改where条件
我面临以下要求。以下查询由过程调用。值Sql 基于列值更改where条件,sql,oracle,Sql,Oracle,我面临以下要求。以下查询由过程调用。值p_pac_code是程序的输入参数 要求是查询应该有一个附加条件sp\sbsp.subsclty\u code!='C430如果p_pac_code值为“008” 对于任何其他p_pac_code值,应按如下方式运行。有没有办法在WHERE子句中添加一个附加条件 现在,我已经使用IF…..ELSE分别使用查询两次,具体取决于p\u pac\u code值。但我需要找到一种方法,只需在这个查询中添加一个条件 SELECT ptg.group_cid
p_pac_code
是程序的输入参数
要求是查询应该有一个附加条件sp\sbsp.subsclty\u code!='C430
如果p_pac_code
值为“008”
对于任何其他p_pac_code
值,应按如下方式运行。有没有办法在WHERE子句中添加一个附加条件
现在,我已经使用IF…..ELSE分别使用查询两次,具体取决于p\u pac\u code
值。但我需要找到一种方法,只需在这个查询中添加一个条件
SELECT ptg.group_cid
FROM PRVDR_TYPE_X_SPCLTY_SUBSPCLTY ptxss,
PT_X_SP_SSP_STATUS pxsst ,
pt_sp_ssp_x_group ptg,
group_x_group_store gg,
specialty_subspecialty sp_sbsp,
treatment_type tt,
provider_type pt
WHERE
pt.PRVDR_TYPE_CODE = ptxss.PRVDR_TYPE_CODE
AND tt.TRTMNT_TYPE_CODE = pxsst.TRTMNT_TYPE_CODE
AND ptxss.PRVDR_TYPE_X_SPCLTY_SID = pxsst.PRVDR_TYPE_X_SPCLTY_SID
AND tt.TRTMNT_TYPE_CODE = p_pac_code
AND TRUNC(SYSDATE) BETWEEN TRUNC(PXSST.FROM_DATE) AND TRUNC(PXSST.TO_DATE)
AND ptg.prvdr_type_code =ptxss.prvdr_type_code
AND ptg.spclty_subspclty_sid = ptxss.spclty_subspclty_sid
AND ptxss.spclty_subspclty_sid = sp_sbsp.spclty_subspclty_sid
AND ptg.spclty_subspclty_sid = sp_sbsp.spclty_subspclty_sid
AND ptg.status_cid = 2
AND ptg.group_cid = gg.group_cid
AND gg.group_store_cid = 16
AND gg.status_cid = 2;
提前感谢。您只需添加如下条件:
... and (
( sp_sbsp.SUBSPCLTY_CODE!='C430' and p_pac_code = '008')
OR
NVL(p_pac_code, '-') != '008'
)
这可以用不同的方式重新编写,这是一个非常不言自明的您可以简单地添加如下条件:
... and (
( sp_sbsp.SUBSPCLTY_CODE!='C430' and p_pac_code = '008')
OR
NVL(p_pac_code, '-') != '008'
)
这可以用不同的方式重新编写,这一条很容易解释。添加以下条件: 和(sp_sbsp.subsclty_代码!=“C430”或p_pac_代码值!=“008”)
(别忘了括号)很简单。添加以下条件: 和(sp_sbsp.subsclty_代码!=“C430”或p_pac_代码值!=“008”) (别忘了括号)只是分享而已
SELECT ptg.group_cid
FROM PRVDR_TYPE_X_SPCLTY_SUBSPCLTY ptxss
WHERE
pt.PRVDR_TYPE_CODE = ptxss.PRVDR_TYPE_CODE
&&((tt.TRTMNT_TYPE_CODE = pxsst.TRTMNT_TYPE_CODE)
or (tt.TRTMNT_TYPE_CODE = pxsst.TRTMNT_TYPE_CODE))
只需使用括号指定条件必须实现的位置。仅共享
SELECT ptg.group_cid
FROM PRVDR_TYPE_X_SPCLTY_SUBSPCLTY ptxss
WHERE
pt.PRVDR_TYPE_CODE = ptxss.PRVDR_TYPE_CODE
&&((tt.TRTMNT_TYPE_CODE = pxsst.TRTMNT_TYPE_CODE)
or (tt.TRTMNT_TYPE_CODE = pxsst.TRTMNT_TYPE_CODE))
只需使用括号指定条件必须实现的位置。只需添加:
AND NOT ( NVL( sp_sbsp.SUBSPCLTY_CODE, 'x' ) = 'C430'
AND NVL( p_pac_code value, 'x' ) = '008' )
到where子句
使用NVL
函数,以便匹配NULL
值(如果数据中存在);否则,即使NULL
与C430
不匹配,您仍然会发现NULL='C430'
和NULL'C430'
和not(NULL='C430')
都将返回false。只需添加:
AND NOT ( NVL( sp_sbsp.SUBSPCLTY_CODE, 'x' ) = 'C430'
AND NVL( p_pac_code value, 'x' ) = '008' )
到where子句
使用NVL
函数,以便匹配NULL
值(如果数据中存在);否则,即使NULL
与C430
不匹配,您仍然会发现NULL='C430'
和NULL'C430'
和not(NULL='C430')
都将返回false