【问题标题】:Need help converting If/then to CASE in SQL需要帮助在 SQL 中将 If/then 转换为 CASE
【发布时间】:2014-04-24 12:23:56
【问题描述】:

我在掌握 CASE 语句的用法(习惯于使用 If/Then)时遇到了一些麻烦。我想将其转换为 CASE 格式:

If DATEPART(Month,Datetime) = 04
       Then UPDATE DB1
       SET column1 = (SELECT Value FROM DB2)

因此,如果当前日期时间的月份与 4(4 月)匹配,则使用 DB2 的 Value 列中的值更新 DB1 的 column1。使用 CASE 会怎样?

【问题讨论】:

  • CASE 是一个表达式。它计算一个

标签: sql tsql case


【解决方案1】:

我不清楚case 与此有什么关系。 case 语句通常用于select 以执行条件语句。你的update 看起来更像:

update db1
    set column1 = db2.value
    from db1 join
         db2
         on db1.foo = db2.bar
    where DATEPART(Month, db1.Datetime) = 4;

但是从你的问题中判断你真正想要做什么有点困难。

编辑:(回应评论)

对于今天的日期,where 子句应该是:

where datepart(month, getdate()) = 4

您可以使用if (datepart(month, getdate()) = 4) . . .,而不是where

需要join(或子查询),因为问题涉及两个表。

【讨论】:

  • +1 :虽然DATEPART(Month, db1.Datetime); 似乎缺少= 4,但我认为 OP 想要测试今天的日期 而不是表格中的日期。
  • @MatBailie 。 . .谢谢
  • ^^^ 你是对的。如果当前月份(今天的日期)是 4 月,我只想执行更新功能。上面的代码是否仍然适用?还有什么是“on db1.foo = db2.bar”?
  • “on db1.foo = db2.bar”指的是什么?我不知道如何把它和我的桌子联系起来。
【解决方案2】:
IF ((SELECT DATEPART(MONTH, GetDate())) = 04)
  UPDATE
    db1
  SET
    column1 = db2.value
  FROM
    db2
  WHERE
    db1.key = db2.key

DATEPART() 嵌入在 SELECT 中,而 SELECT 本身又包含在 () 中。

WHERE 子句用于指定 db2 中的哪些行用于更新 db1 中的哪些行。

在 T-SQL 中没有THEN。详情请见here

【讨论】:

  • 两个表中的列大小相同(5 行),我想移动所有行。 where 子句会是什么样子?
  • 我完全删除了 where 语句,但它只将第一个值从 db2 复制到 db1 的所有行中。
  • @user3532047 - 功能上发生的事情是db2中的all 5行被复制到每个db1 中的行,5 行写入第 1 行,相同的 5 行再次写入第 2 行,依此类推。5 行中的每一个都写在前一个上,因此您只能看到最后写入的值。您需要是每个表中的id 列,允许您声明WHERE db1.id = db2.id。您的表是否有一列(或多列)允许您唯一标识行?就像JOIN;你需要一些东西来告诉 RDBMS this row from db2 lines up with that row from db1
  • 我没有 ID 列。我不确定是否可以,因为每次运行查询时这些表都会被完全截断。
  • @user3532047 - 那么你如何确定将每个值放入哪一行?一定有某种逻辑,如果你在纸上画了 db1 和 db2,你可以画 5 个箭头,一个来自 db2 中的每个值,每个指向 db1 中的不同行,写着this goes to here
【解决方案3】:

我认为您的查询没有相同的 CASE 语句。

MSDN查看CASE快递

评估条件列表并返回多个可能的结果表达式之一。

您的查询是不返回任何内容的条件更新操作。你能在这里澄清一下你的意图吗?

【讨论】:

  • 查看第一个答案。该代码对我有用,只需要知道如何指定复制所有行。
  • 我知道这行得通。但是,当条件为假时,if 语句不执行 UPDATE。对于第一个答案,即使您只需要简单的日期检查,它也会扫描整个表。这是巨大的性能差异。我不确定 SQL Server 是否足够聪明,可以在 WHERE 子句为 false 时忽略 UPDATE。要复制所有行,您需要指定 DB1 和 DB2 之间的关系。这就是 foo 和 bar 的来源。
  • 我不确定如何指定这种关系......我尝试再次输入列名而不是 foo 和 bar 但它没有复制任何内容。
猜你喜欢
  • 2018-11-24
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
相关资源
最近更新 更多