【问题标题】:Get current item in loop in SQL在 SQL 中循环获取当前项
【发布时间】:2020-11-23 00:17:00
【问题描述】:

如果我在 SQL 中编写循环,例如:

DECLARE @Counter INT = 0 

SET @length = (SELECT COUNT(*) FROM table)

WHILE @Counter <= @length
BEGIN
    DECLARE @id INT = (SELECT TOP 1 id FROM table WHERE id = @Counter)
    DECLARE @someValue int = (SELECT TOP 1 someValue FROM table WHERE id = @id)
END

我以前从未在 SQL 中编写过循环,我需要的是从循环中的当前项目中获取值并使用它。

在上面的代码中,我使用SELECT 来获取someValue

我需要像这样为我需要的所有字段创建select,还是有一些更简单的方法,比如 foreach 循环并获取当前的item.someValue

更新

基于 cmets 可能我不需要循环。

这是示例表

create table products 
(
    tourId int NOT NULL IDENTITY PRIMARY KEY, 
    title nvarchar(50),
    orderTime smalldatetime,
    orderSecondTime smalldatetime,
    orderThirdTime smalldatetime
);

orderTime 有值,orderSecondTimeorderThirdTimeNULL

我需要在orderTime 上创建一些CASE..WHEN 并更新orderSecondTimeorderThirdTime

当我说CASE...WHEN 时,我需要根据 orderTime 中的日期更新其他列,例如:

orderThirdTime 可以依赖 orderSecondTime 这是我认为循环是自然解决方案的地方。

那些其他列基本上都是加orderSecondTime = 24h + orderTimeorderThirdTime = orderTime to orderSecondTime之类的。

更新 #2

示例规则:

如果 orderTime 在 08:00 和 10:00 之间:

  • orderSecondTime = orderTime + 60 分钟
  • orderThirdTime = orderSecondTime(以上计算)+ 60 分钟
  • ELSE 使用不同的计算方式,例如加 30 分钟

我有什么

tourId  title   orderTime           orderSecondTime orderThirdTime
-------------------------------------------------------------------
1       prod1   2020-08-02 08:00    null            null
2       prod12  2020-08-02 09:00    null            null
3       prod13  2020-08-02 10:00    null            null
4       prod14  2020-08-02 11:00    null            null

我要计算的内容

【问题讨论】:

  • 就目前而言,这段代码毫无意义。解释你正在尝试做什么会有所帮助。
  • 我有表,我需要遍历每一行,从每一行获取一些列,以便在循环内进行其他计算。在每次迭代中,我都会在另一个表中插入新行(带有计算值)。
  • 你为什么首先使用循环? SQL 擅长基于集合的方法,而WHILE 则完全相反。
  • 您可能不需要循环。如果您向我们提供完整的图片,那么我们可能会提出比循环更有效的建议。
  • 我更新了问题,详细说明了我正在尝试做什么以及为什么我认为循环是这种情况的解决方案。

标签: sql sql-server datetime sql-server-2008 sql-update


【解决方案1】:

你不是刚用了几个CASE 表达式吗?

SELECT id,
       title,
       orderTime,
       CASE WHEN CONVERT(time,orderTime) >= '08:00' AND CONVERT(time,orderTime) <= '10:00' THEN DATEADD(HOUR, 1, orderTime)
                                                                                           ELSE DATEADD(MINUTE, 30, orderTime)
       END AS orderSecondTime,
       CASE WHEN CONVERT(time,orderTime) >= '08:00' AND CONVERT(time,orderTime) <= '10:00' THEN DATEADD(HOUR, 2, orderTime)
                                                                                           ELSE DATEADD(HOUR, 1, orderTime)
       END AS orderSecondTime
FROM dbo.YourTable;

旁注:一年多来,SQL Server 2008 完全不受支持。如果还没有,您应该尽快查看升级路径。

【讨论】:

  • 然后使用具有相同逻辑的UPDATE 语句,@1110 ... CASE 表达式就是您所追求的。您只需从UPDATE dbo.YourTableUPDATE {Table Alias} 开始,而不是SELECT...
猜你喜欢
  • 2013-09-06
  • 2023-01-23
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 2015-06-10
相关资源
最近更新 更多