在sql中获取循环中的当前项

oxf4rvwz  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(255)

如果我用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 ?
更新
根据评论,也许我不需要循环。
这是示例表

create table products 
(
    tourId int NOT NULL IDENTITY PRIMARY KEY, 
    title nvarchar(50),
    orderTime smalldatetime,
    orderSecondTime smalldatetime,
    orderThirdTime smalldatetime
);
``` `orderTime` 有价值, `orderSecondTime` 以及 `orderThirdTime` 是 `NULL` .
我需要做一些 `CASE..WHEN` 在 `orderTime` 和更新 `orderSecondTime` 以及 `orderThirdTime` .
当我说 `CASE...WHEN` 我需要根据ordertime中的日期更新其他列,如: `orderThirdTime` 可以依靠 `orderSecondTime` 这就是我认为循环是自然解决方案的地方。
其他列基本上是add
orderSecondTime = 24h + orderTime `orderThirdTime = orderTime to orderSecondTime` 类似的。
更新#2:
示例规则:
如果订购时间在08:00到10:00之间:
ordersecondtime=订单时间+60分钟
orderthirdtime=ordersecondtime(以上计算)+60分钟
否则使用不同的计算方法,比如加30分钟
我所拥有的
![](https://i.stack.imgur.com/VAOdu.png)

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

我想计算的是
![](https://i.stack.imgur.com/Q6gu1.png)
92vpleto

92vpleto1#

你不是刚喝了几杯吗 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;

旁注:SQLServer2008已经完全不受支持一年多了。您应该尽快查看升级路径(如果还没有)。

相关问题