有什么办法可以使这种情况起作用?

时间:2019-08-19 06:16:28

标签: sql sql-server conditional-statements

这是我的桌子:

DATE        |BRANCH   |DESC
2019-12-25  |ALL      |Christmas Day
2019-12-25  |HO       |Christmas Day
2019-12-25  |TES      |Christmas Day

这是我的查询

DECLARE 
@APPTDATE Datetime = '2019-12-25',
@BRANCHCODE varchar(50) = 'HO'

SELECT *
FROM TABLE_NAME
WHERE CAST([DATE] AS DATE) = CAST(@APPTDATE AS DATE) AND ((BRANCH = @BRANCHCODE) OR (BRANCH != @BRANCHCODE AND BRANCH = 'ALL'))

结果:

DATE        |BRANCH   |DESC
2019-12-25  |ALL      |Christmas Day
2019-12-25  |HO       |Christmas Day

这是我想要的结果;

如果([BRANCH] = HO),我只需要显示具有[BRANCH] =“ HO”的[DESC];

DATE        |BRANCH   |DESC
2019-12-25  |HO       |Christmas Day

或者如果表中不存在[BRANCH]的值,但是数据库中存在指定的日期;

DATE        |BRANCH   |DESC
2019-12-25  |ALL      |Christmas Day

编辑:

因此,如果BRANCH = HO且DATE ='2019-12-25'并且表为:

DATE        |BRANCH   |DESC
2019-12-25  |ALL      |Christmas Day (1)
2019-12-25  |TES      |Christmas Day (2)

由于分支列表中不存在HO,但是日期确实存在,因此输出应为:

DATE        |BRANCH   |DESC
2019-12-25  |ALL      |Christmas Day (1)

因为ALL =表示只要日期条件为true的任何分支。

是否可以使用where语句中的条件获得结果?或者有更好的方法来执行这种结果?

3 个答案:

答案 0 :(得分:1)

IF EXISTS (SELECT branch FROM table where branch = @BRANCHCODE)
    BEGIN
        SELECT * FROM table where branch = @branchcode
    END
ELSE
    BEGIN
        SELECT * FROM table WHERE CAST([DATE] AS DATE) = CAST(@APPTDATE AS DATE)
    END

这两个可能是解决方案。尚未在架构上对其进行测试。希望对您有所帮助。

SELECT * FROM Table 
WHERE
 1= CASE WHEN branch = @branchCode THEN 1 
 ELSE CASE WHEN CAST([DATE] AS DATE) = CAST(@APPTDATE AS DATE) AND branch != @branchcode THEN 1 ELSE 0 END END 

答案 1 :(得分:1)

在两种情况下使用UNION ALL

DECLARE 
@APPTDATE Datetime = '2019-12-25',
@BRANCHCODE varchar(50) = 'HO'

SELECT * FROM TABLE_NAME
WHERE [BRANCH] = @BRANCHCODE
UNION ALL
SELECT * FROM TABLE_NAME
WHERE CAST([DATE] AS DATE) = CAST(@APPTDATE AS DATE) AND [BRANCH] = 'ALL'
AND NOT EXISTS (
  SELECT 1 FROM TABLE_NAME
  WHERE [BRANCH] = @BRANCHCODE
)

请参见demo

答案 2 :(得分:0)

您可以在脚本下方尝试此操作-

DECLARE @APPTDATE DATETIME= '2019-12-25', 
    @BRANCHCODE VARCHAR(50)= 'HO';

SELECT *
FROM TABLE_NAME
WHERE BRANCH = @BRANCHCODE
OR(
    BRANCH <> @BRANCHCODE
    AND CAST([DATE] AS DATE) = CAST(@APPTDATE AS DATE)
)

更新

SELECT *
FROM your_table
WHERE BRANCH = @BRANCHCODE
OR(
    BRANCH ='ALL'
    AND CAST([DATE] AS DATE) = CAST(@APPTDATE AS DATE)
)
相关问题