【问题标题】:How do I compare two columns in SQL Server 2016 and if not equal, set them equal based off a condition?如何比较 SQL Server 2016 中的两列,如果不相等,则根据条件将它们设置为相等?
【发布时间】:2021-09-30 18:42:13
【问题描述】:

我正在创建一个查询来提取 ID、日期、状态等的大量信息。除了这部分之外,我几乎已经完成了所有工作。我正在尝试比较两个变量(我将在这里调用S_End 和P_EndDate),如果P_EndDate 在S_End 之后,那么我需要设置S_End = P_EndDate。

这两个变量的日期都以以下格式存储:YYYY/MM/DD HH:MM:SS。

这是我目前对查询的这个特定部分的内容,只是为了缩小到几个条目将被应用到:

SELECT status, ID, SStart, S_End, P_EndDate, comment FROM myTable
WHERE SStart IS NOT NULL AND STATUS = 'NOT DONE' AND S_End <> P_EndDate

这很有效,让我在P_EndDate 在S_End 之前/之后的位置获得了我需要的几个条目,但我真的不确定如何比较/设置S_End = P_EndDate。我尝试过使用类似于

的IF 语句
IF S_End > P_EndDate 
   BEGIN 
      S_End  = P_EndDate 
   END
ELSE 
   BEGIN
      S_End  = S_End  
   END

但我不断收到语法错误或在 IF 旁边显示意外语法的消息。我尝试使用CAST 将S_End 和P_EndDate 都转换为YYYY/MM/DD,然后进行比较,但仍然没有运气。我觉得这很容易,我应该知道,但我不确定如何去做。

【问题讨论】:

  • 可能是因为S_End 不是变量名。是这些变量,还是您尝试在 IF 语句中使用列?
  • 只需使用CASE 表达式CASE WHEN S_End &gt; P_EndDate THEN P_EndDate ELSE S_End END 将其放入您的SELECT
  • @dougp 是的,我的错。我对此很陌生。谢谢你。
  • @Charlieface 谢谢!

标签: sql sql-server sql-server-2016


【解决方案1】:

SQL 变量以“@”符号开头。这些看起来像列。如果您想设置列,那么...

UPDATE myTable
SET S_End = P_EndDate
WHERE S_End > P_EndDate

如果您不想更改数据,只希望查询在这些情况下显示 P_EndDate,然后使用 case 语句:

SELECT status, ID, SStart, S_End = CASE
   WHEN S_End > P_EndDate THEN P_EndDate
   ELSE S_End
   END, P_EndDate, comment FROM myTable
WHERE SStart IS NOT NULL AND STATUS = 'NOT DONE' AND S_End <> P_EndDate

如果你真的想要变量,那么你需要声明它们并设置它们的值。

【讨论】:

  • 是的,我很困惑。谢谢!不小心覆盖了数据哈哈,但幸运的是我知道确切的记录,所以我能够将其改回应有的状态。再次感谢您!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多