Sql server SQL Server:使用一条带2个条件的Select语句

Sql server SQL Server:使用一条带2个条件的Select语句,sql-server,if-statement,Sql Server,If Statement,我有下面的SQL查询,我需要它只运行一次SELECT语句 我可以知道我应该做些什么改变吗 编辑:需要更改为仅使用一条SELECT语句 DECLARE @lang varchar(2) ='en', @hideInactiveCompany integer = 0 IF @hideInactiveCompany = 1 SELECT <all columns> FROM Config.BusinessUnit BU LEFT JOIN Config.Organization

我有下面的SQL查询,我需要它只运行一次
SELECT
语句

我可以知道我应该做些什么改变吗

编辑:需要更改为仅使用一条
SELECT
语句

DECLARE
@lang varchar(2) ='en',
@hideInactiveCompany integer = 0

IF @hideInactiveCompany = 1
SELECT <all columns>
  FROM Config.BusinessUnit BU
  LEFT JOIN Config.Organization CO on BU.OrganizationId = CO.OrganizationId
  LEFT JOIN Config.ParentBusinessUnit PBU on BU.ParentBusinessUnitId = PBU.ParentBusinessUnitId 
  WHERE BU.IsActive = 1 --the additional condition if @hideInactiveCompany=1
  ORDER BY CASE WHEN @lang = 'cn' THEN BU.Lang END,
           CASE WHEN @lang = 'en' THEN BU.Lang END DESC, 
           EntityName
ELSE
SELECT <all columns>
  FROM Config.BusinessUnit BU
  LEFT JOIN Config.Organization CO on BU.OrganizationId = CO.OrganizationId
  LEFT JOIN Config.ParentBusinessUnit PBU on BU.ParentBusinessUnitId = PBU.ParentBusinessUnitId 
  ORDER BY CASE WHEN @lang = 'cn' THEN BU.Lang END,
           CASE WHEN @lang = 'en' THEN BU.Lang END DESC, 
           EntityName
声明
@lang varchar(2)=‘en’,
@hideInactiveCompany整数=0
如果@hideInactiveCompany=1
选择
来自Config.BusinessUnit BU
BU.OrganizationId=CO.OrganizationId上的左JOIN Config.Organization CO
BU.ParentBusinessUnitId=PBU.ParentBusinessUnitId上的LEFT JOIN Config.ParentBusinessUnit PBU
其中BU.IsActive=1——如果@hideInactiveCompany=1,则为附加条件
当@lang='cn'然后BU.lang END时按大小写排序,
当@lang='en'然后BU.lang END DESC,
实体名字
其他的
选择
来自Config.BusinessUnit BU
BU.OrganizationId=CO.OrganizationId上的左JOIN Config.Organization CO
BU.ParentBusinessUnitId=PBU.ParentBusinessUnitId上的LEFT JOIN Config.ParentBusinessUnit PBU
当@lang='cn'然后BU.lang END时按大小写排序,
当@lang='en'然后BU.lang END DESC,
实体名字

如果@hideInactiveCompany=1,则显示BU.IsActive=1的输出

如果@hideInactiveCompany=0,则显示不带BU.IsActive的输出 过滤器

您不能在SQL中执行这种“有条件地构建我的选择”。您需要编写两次完整的select查询,一次用于
if
的每个分支

(SQL通常不是一种“可组合”语言,您无法按照自己的意愿自由组合元素。)

您可以使用
case
和其他表达式在单个查询中重建,或者将查询的公共部分执行到临时表(或表值变量)中,然后只执行最后一部分两次。

您不能在SQL中执行这种“有条件地构建我的选择”。您需要编写两次完整的select查询,一次用于
if
的每个分支

(SQL通常不是一种“可组合”语言,您无法按照自己的意愿自由组合元素。)


您可以使用
case
和其他表达式在单个查询中重建,或者将查询的公共部分执行到临时表(或表值变量)中,然后只执行最后一部分两次。

我们可以尝试编写以下
WHERE
子句:

WHERE
    (hideInactiveCompany = 1  AND BU.IsActive IS NOT NULL) OR
    (hideInactiveCompany IS NULL AND BU.IsActive IS NULL) OR
    (hideInactiveCompany <> 1)
在哪里
(hideInactiveCompany=1且BU.IsActive不为空)或
(hideInactiveCompany为空,BU.IsActive为空)或
(hideInactiveCompany 1)
注:在我回答后,OP对问题进行了几次更改。最新的答案似乎是:

WHERE
    (hideInactiveCompany = 1 AND BU.IsActive = 1) OR
    hideInactiveCompany IS NULL OR hideInactiveCompany <> 1
在哪里
(hideInactiveCompany=1且BU.IsActive=1)或
hideInactiveCompany为NULL或hideInactiveCompany 1

我们可以尝试编写以下
WHERE
子句:

WHERE
    (hideInactiveCompany = 1  AND BU.IsActive IS NOT NULL) OR
    (hideInactiveCompany IS NULL AND BU.IsActive IS NULL) OR
    (hideInactiveCompany <> 1)
在哪里
(hideInactiveCompany=1且BU.IsActive不为空)或
(hideInactiveCompany为空,BU.IsActive为空)或
(hideInactiveCompany 1)
注:在我回答后,OP对问题进行了几次更改。最新的答案似乎是:

WHERE
    (hideInactiveCompany = 1 AND BU.IsActive = 1) OR
    hideInactiveCompany IS NULL OR hideInactiveCompany <> 1
在哪里
(hideInactiveCompany=1且BU.IsActive=1)或
hideInactiveCompany为NULL或hideInactiveCompany 1
在其他情况下使用:

ALTER PROCEDURE [Config].[usp_ListBusinessUnit] 
@lang VARCHAR(2) = NULL,
@hideInactiveCompany INTEGER
AS
BEGIN


IF @hideInactiveCompany=1
    SELECT <all columns>
    FROM Config.BusinessUnit BU
    LEFT JOIN Config.Organization CO ON BU.OrganizationId = CO.OrganizationId
    LEFT JOIN Config.ParentBusinessUnit PBU ON BU.ParentBusinessUnitId = 
PBU.ParentBusinessUnitId 
    WHERE BU.IsActive IS NOT NULL
    ORDER BY 
        CASE WHEN @lang = 'cn' THEN BU.Lang END,
        CASE WHEN @lang = 'en' THEN BU.Lang END DESC, 
        EntityName

ELSE

   SELECT <all columns>
    FROM Config.BusinessUnit BU
    LEFT JOIN Config.Organization CO ON BU.OrganizationId = CO.OrganizationId
    LEFT JOIN Config.ParentBusinessUnit PBU ON BU.ParentBusinessUnitId = 
PBU.ParentBusinessUnitId 
    WHERE BU.IsActive IS NULL
    ORDER BY 
    CASE WHEN @lang = 'cn' THEN BU.Lang END,
    CASE WHEN @lang = 'en' THEN BU.Lang END DESC, 
    EntityName

END
ALTER PROCEDURE[Config].[usp\U ListBusinessUnit]
@lang VARCHAR(2)=空,
@hideInactiveCompany整数
像
开始
如果@hideInactiveCompany=1
选择
来自Config.BusinessUnit BU
BU.OrganizationId=CO.OrganizationId上的左JOIN Config.Organization CO
BU上的LEFT JOIN Config.ParentBusinessUnit PBU.ParentBusinessUnitId=
PBU.ParentBusinessUnitId
其中BU.IsActive不为空
订购人
当@lang='cn'然后BU.lang结束时,
当@lang='en'然后BU.lang END DESC,
实体名字
其他的
选择
来自Config.BusinessUnit BU
BU.OrganizationId=CO.OrganizationId上的左JOIN Config.Organization CO
BU上的LEFT JOIN Config.ParentBusinessUnit PBU.ParentBusinessUnitId=
PBU.ParentBusinessUnitId
其中BU.IsActive为NULL
订购人
当@lang='cn'然后BU.lang结束时,
当@lang='en'然后BU.lang END DESC,
实体名字
终止
在其他情况下使用:

ALTER PROCEDURE [Config].[usp_ListBusinessUnit] 
@lang VARCHAR(2) = NULL,
@hideInactiveCompany INTEGER
AS
BEGIN


IF @hideInactiveCompany=1
    SELECT <all columns>
    FROM Config.BusinessUnit BU
    LEFT JOIN Config.Organization CO ON BU.OrganizationId = CO.OrganizationId
    LEFT JOIN Config.ParentBusinessUnit PBU ON BU.ParentBusinessUnitId = 
PBU.ParentBusinessUnitId 
    WHERE BU.IsActive IS NOT NULL
    ORDER BY 
        CASE WHEN @lang = 'cn' THEN BU.Lang END,
        CASE WHEN @lang = 'en' THEN BU.Lang END DESC, 
        EntityName

ELSE

   SELECT <all columns>
    FROM Config.BusinessUnit BU
    LEFT JOIN Config.Organization CO ON BU.OrganizationId = CO.OrganizationId
    LEFT JOIN Config.ParentBusinessUnit PBU ON BU.ParentBusinessUnitId = 
PBU.ParentBusinessUnitId 
    WHERE BU.IsActive IS NULL
    ORDER BY 
    CASE WHEN @lang = 'cn' THEN BU.Lang END,
    CASE WHEN @lang = 'en' THEN BU.Lang END DESC, 
    EntityName

END
ALTER PROCEDURE[Config].[usp\U ListBusinessUnit]
@lang VARCHAR(2)=空,
@hideInactiveCompany整数
像
开始
如果@hideInactiveCompany=1
选择
来自Config.BusinessUnit BU
BU.OrganizationId=CO.OrganizationId上的左JOIN Config.Organization CO
BU上的LEFT JOIN Config.ParentBusinessUnit PBU.ParentBusinessUnitId=
PBU.ParentBusinessUnitId
其中BU.IsActive不为空
订购人
当@lang='cn'然后BU.lang结束时,
当@lang='en'然后BU.lang END DESC,
实体名字
其他的
选择
来自Config.BusinessUnit BU
BU.OrganizationId=CO.OrganizationId上的左JOIN Config.Organization CO
BU上的LEFT JOIN Config.ParentBusinessUnit PBU.ParentBusinessUnitId=
PBU.ParentBusinessUnitId
其中BU.IsActive为NULL
订购人
当@lang='cn'然后BU.lang结束时,
当@lang='en'然后BU.lang END DESC,
实体名字
终止

如果我正确理解了您的要求,那么整个查询应该只有一个SELECT子句

DECLARE
    @lang varchar(2) ='en',
    @hideInactiveCompany integer = 0

SELECT    <all columns>
FROM      Config.BusinessUnit BU
LEFT JOIN Config.Organization CO on BU.OrganizationId = CO.OrganizationId
LEFT JOIN Config.ParentBusinessUnit PBU on BU.ParentBusinessUnitId = PBU.ParentBusinessUnitId 
WHERE     (@hideInactiveCompany = 1 AND BU.IsActive = 1)
OR        (@hideInactiveCompany <> 1)
ORDER BY   CASE WHEN @lang = 'cn' THEN BU.Lang END,
           CASE WHEN @lang = 'en' THEN BU.Lang END DESC, 
           EntityName
声明
@lang varchar(2)=‘en’,
@hideInactiveCompany整数=0
选择
来自Config.BusinessUnit BU
BU.OrganizationId=CO.OrganizationId上的左JOIN Config.Organization CO
BU.ParentBusinessUnitId=PBU.ParentBusinessUnitId上的LEFT JOIN Config.ParentBusinessUnit PBU
其中(@hideInactiveCompany=1和BU.IsActive=1)
或(@hideInactiveCompany 1)
当@lang='cn'然后BU.lang END时按大小写排序,
当@lang='en'然后BU.lang END DESC,
实体名字
关于
的说明,其中
基本上只有两个条件:-

  • 条件1:
    @hideInactive