Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql WHERE子句中的CASE用法_Sql_Sql Server - Fatal编程技术网

Sql WHERE子句中的CASE用法

Sql WHERE子句中的CASE用法,sql,sql-server,Sql,Sql Server,代码如下: CREATE PROCEDURE [dbo].[PR_CDMS_ADMIN_GET_SECURITY_INFO] ( DECLARE @chvMajorCatgry varchar(50) DECLARE @chvMinorCatgry varchar(50) ) AS if (@chvMajorCatgry = 'yyy') begin select caf.ACTN_FACT_SID

代码如下:

CREATE PROCEDURE [dbo].[PR_CDMS_ADMIN_GET_SECURITY_INFO] (    
 DECLARE @chvMajorCatgry varchar(50) 
 DECLARE @chvMinorCatgry varchar(50)   

)    
AS        

if (@chvMajorCatgry = 'yyy')
    begin
        select caf.ACTN_FACT_SID            
        from CDMS_ACTN_FACT caf     
        where caf.ACTN_SID in (select ACTN_SID from CDMS_ACTN where ACTN_CATGRY_CD = 'yyy') 
        print @chvMajorCatgry   
    end
    print @chvMajorCatgry
else if (@chvMajorCatgry = 'zzz')
    begin 
        select  caf.ACTN_FACT_SID           
        from CDMS_ACTN_FACT caf     
        where caf.ACTN_SID = (select ACTN_SID from CDMS_ACTN where ACTN_CATGRY_CD = 'zzz' and ACTN_CD = @chvMinorCatgry)        
    end

如何处理这一点,使其具有一个select语句?

Bleh,这很粗糙。试试这个:

    select  caf.ACTN_FACT_SID           
    from CDMS_ACTN_FACT caf     
    where caf.ACTN_SID IN (
               select ACTN_SID 
               from CDMS_ACTN 
               where ( 
                       @chvMinorCatgry = 'zzz' 
                       AND ACTN_CATGRY_CD = 'Attribute' 
                       AND ACTN_CD = @chvMinorCatgry)
                     )
               OR    (
                       @chvMinorCatgry = 'yyy' 
                       AND ACTN_CATGRY_CD = 'Account'
                     )
             )

请看下面我的建议。根据ACTN_CD列的数据类型,您可能需要更改子查询中case语句末尾的通配符

CREATE PROCEDURE [dbo].[PR_CDMS_ADMIN_GET_SECURITY_INFO] (    
  @chvMajorCatgry varchar(50),
 @chvMinorCatgry varchar(50)   
 --SET @chvMajorCatgry = 'Account'
)    
AS      

select caf.ACTN_FACT_SID            
from CDMS_ACTN_FACT caf     
where caf.ACTN_SID in (
                       select ACTN_SID 
                       from CDMS_ACTN 
                       where ACTN_CATGRY_CD = @chvMajorCatgry
                       and ACTN_CD like case @chvmajorcatgry when 'Attribute' then @chvMinorCatgry else '%' end) 

我不需要任何if-else检查..我想要一个带有case in-where子句的语句..在实时代码中我有大约30个if-else语句,其中包含两种where子句变体..我在这里使用的代码示例仅限于这两种类型。