【问题标题】:Is there any way I can make this condition work?有什么办法可以使这种情况起作用吗?
【发布时间】:2019-08-19 06:16:28
【问题描述】:

这是我的桌子:

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 = 表示只要日期条件为真的任何分支。

是否可以使用我的 where 语句中的条件来实现结果,或者有更好的方法来执行这样的结果?

【问题讨论】:

  • 这 3 个输入行的预期最终输出是什么?
  • 因此,您希望表中的所有行分支为 HO 或提供的 @BRANCHCODE 不存在于表中,对吗?
  • @mkRabbani 第一个结果是错误的最后一个(2)是我想要的输出。
  • @Abra 是的先生,但我只需要单行结果。

标签: sql sql-server conditional-statements


【解决方案1】:

如果你知道你想要后排,你可以使用order bytop

SELECT TOP (1) t.*
FROM TABLE_NAME t
WHERE CAST([DATE] AS DATE) = CAST(@APPTDATE AS DATE) AND 
      BRANCH IN ('ALL', @BRANCHCODE) 
ORDER BY (CASE WHEN BRANCHE = @BRANCHCODE THEN 1 ELSE 2 END);

这只会选择所需的分支和'ALL'。然后顺序将它们与所需的第一个顺序排列在一起,TOP (1) 选择先到的那个。

【讨论】:

  • 我喜欢这种方法,因为它只需要一个选择查询,并且不那么复杂,谢谢!
【解决方案2】:

在这两种情况下使用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

【讨论】:

    【解决方案3】:
    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= CASE WHEN branch = @branchCode THEN 1,先生,“1”是什么意思?
    • 它只是一个表示这条记录的指标应该在结果集中。或者你可以认为它是“真”
    • 1 没有任何意义,基本上当分支代码匹配 && 日期匹配时,它会折叠成 1=1,否则它的 1=0
    • 我的查询结果相同,先生。
    • 立即尝试第二种解决方案
    【解决方案4】:

    你可以试试下面这个脚本-

    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)
    )
    

    【讨论】:

    • 与我现有查询的结果相同,先生
    • 你能把这 3 个输入行的预期输出放在一起吗?这会有所帮助。
    • 如果输入表中也有 HO 怎么办?
    • 那么即使 [BRANCH] = ALL 存在于表中,具有 [BRANCH] = HO 的行也必须是输出结果。
    • 还是和我现有的查询结果一样,先生。
    猜你喜欢
    • 1970-01-01
    • 2018-02-25
    • 2012-09-09
    • 2018-05-05
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2013-11-14
    • 2012-03-28
    相关资源
    最近更新 更多