繁体   English   中英

SQL Server:如何使用if else语句从同一表中选择不同的数据

[英]SQL Server: how to use if else statement to select different data from same table

我正在使用以下存储过程从到目前为止可以正常工作的表中选择数据。

现在,我想创建两种不同的情况,而不需要重复整个查询:如果输入@selection =“ active”,则选择不等于statusX =“ Published”的所有内容,否则请选择所有与statusX =“ Published”相等的内容。

谁能告诉我如何在这里实现?

我的存储过程(减少的列):

ALTER PROCEDURE [dbo].[FetchRequests]
    @selection nvarchar(20)
AS
BEGIN
    SET NOCOUNT ON;
    SELECT      col1,
                col2,
                col3,
                col4,
                col5,
                statusX,
                logStatus,
                logID
    FROM        LogRequests
    WHERE       logStatus = 'active'
    ORDER BY    logID desc
    FOR XML PATH('cols'), ELEMENTS, TYPE, ROOT('ranks')

END

蒂姆,非常感谢您对此提供的任何帮助。

您可以只使用条件WHERE子句:

ALTER PROCEDURE [dbo].[FetchRequests]
    @selection nvarchar(20)
AS
BEGIN
    SET NOCOUNT ON;
    SELECT      col1,
                col2,
                col3,
                col4,
                col5,
                statusX,
                logStatus,
                logID
    FROM        LogRequests
    WHERE       logStatus = 'active'
    AND ((statusX <> 'Published' AND @selection = 'active')
    OR (statusX = 'Published' AND @selection <> 'active'))
    ORDER BY    logID desc
    FOR XML PATH('cols'), ELEMENTS, TYPE, ROOT('ranks')

END

在您的WHERE添加AND子句:

AND (@selection = 'active') = (StatusX <> 'Published')

(我看到这是其他海报提出的两行的结合。嗯,我想是口味问题:))

怎么样

where 
(@selection = 'active' and statusX != 'Published') 
or
(@selection != 'active' and statusX = 'Published') 

您可以尝试类似

SELECT      col1,
            col2,
            col3,
            col4,
            col5,
            statusX,
            logStatus,
            logID
FROM        LogRequests
WHERE       logStatus = 'active'
AND         (
                    (@selection = "active" AND statusX <> "Published")
                OR  (@selection <> "active" AND statusX = "Published")
            )
ORDER BY    logID desc
FOR XML PATH('cols'), ELEMENTS, TYPE, ROOT('ranks')
ALTER PROCEDURE [dbo].[FetchRequests]
    @selection nvarchar(20)
AS
BEGIN
Declare @query as nvarchar(4000)

@query=
    'SET NOCOUNT ON;
    SELECT      col1,
                col2,
                col3,
                col4,
                col5,
                statusX,
                logStatus,
                logID
    FROM        LogRequests
    WHERE       logStatus = ''active'' and statusX ' + 
    Select case when @selection = 'active' then '<>'
              else '='
    END + '''Published''
    ORDER BY    logID desc
    FOR XML PATH(''cols''), ELEMENTS, TYPE, ROOT(''ranks'')'
execute @query
END

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM