【问题标题】:SQL case expression is not giving desired resultSQL case 表达式没有给出想要的结果
【发布时间】:2024-01-11 21:06:01
【问题描述】:

我有以下情况。样本数据:

OCTeamID (int) OCTeamLastTime (datetime)
1 1970-01-01 00:00:00
2 2022-01-21 00:37:23
3 1970-01-01 00:00:00
4 2022-01-21 00:37:23
5 1970-01-01 00:00:00

我正在尝试的是以下内容:

OCTeamLastTime 列行中的日期时间值高于当前日期时间CURRENT_TIMESTAMP 时,我希望SQL 变量为Now,否则使用OCTeamLastTime 中的值作为CanDoOC

我目前正在尝试以下语句。但这给了我现在每个结果的结果。

SELECT OCTeamName, OCTeamID, OCTeamLastTime, (
    CASE WHEN(SELECT COUNT(OCTeamID) FROM OCTable WHERE OCTeamLastTime >= CURRENT_TIMESTAMP AND OCTeamID = OCTeamID) > 0 THEN 'Now' ELSE OCTeamLastTime END
) AS CanDoOC
FROM OCTable

我想在 php/html 的选项列表中使用这些结果。基于上表的预期结果:

<option data-subtext="Next OC: <?php echo $SelectOCTeam['CanDoOC']; ?>" value="<?php echo $SelectOCTeam['OCTeamID']; ?>"><?php echo $SelectOCTeam['OCTeamName']; ?></option>

在这种情况下,它应该创建 5 个选项。使用 Next OC:现在对于 ID 为 1,3 和 5 的团队以及其他选项的 OCTeamLastTime 值。

有谁可以做到这一点?因为我所做的没有工作,我想不出任何其他方法来完成这项工作。

【问题讨论】:

    标签: php sql case


    【解决方案1】:

    我相信你只想要下面的查询(没有子查询)

    SELECT OCTeamName,OCTeamID,OCTeamLastTime, 
        CASE WHEN OCTeamLastTime >= CURRENT_TIMESTAMP 
          THEN 'Now' 
          ELSE OCTeamLastTime 
          END AS CanDoOC 
    FROM OCTable
    

    【讨论】:

    • 感谢您的回复。我认为您是对的,但是在测试时出现语法错误。 #1064 - Er is iets fout in de gebruikte syntax bij 'THEN 'Now' ELSE OCTeamLastTime END) AS CanDoOC FROM OCTable ...' in regel 3
    • @Martin4523 我相信问题出在返回数据类型上。可以尝试将OCTeamLastTime 替换为CAST(OCTeamLastTime as VARCHAR(20)) 吗?
    • 有人编辑了您的答案。似乎把 () 去掉了。像那样尝试过,这很有效,给了我想要的结果。谢谢 :) SELECT OCTeamName,OCTeamID,OCTeamLastTime, CASE WHEN CURRENT_TIMESTAMP >= OCTeamLastTime THEN 'Now' ELSE OCTeamLastTime END AS CanDoOC from OCTable
    【解决方案2】:

    您可以为此使用CASE 表达式:

    SELECT CASE
        WHEN OCTeamLastTime < CURRENT_TIMESTAMP THEN 'Now'
        ELSE OCTeamLastTime
    END AS CanDoOC
    FROM ...
    

    【讨论】:

      【解决方案3】:

      只需对查询稍作修改即可帮助您获得所需的输出

      选择 OCTeamName、OCTeamID、OCTeamLastTime、 (OCTeamLastTime >= CURRENT_TIMESTAMP THEN 'Now' ELSE OCTteamLastTime END 的情况)作为来自 OCTable 的 CanDoOC

      【讨论】: