Получить текущий элемент в л oop в SQL - PullRequest
0 голосов
/ 02 августа 2020

Если я напишу l oop в 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

Я никогда раньше не писал l oop в SQL, и мне нужно взять значения из текущего элемента в l oop и используйте его.

В приведенном выше коде я использую SELECT, чтобы получить someValue.

Нужно ли мне делать select как это для всех полей, которые мне нужны, или там это какой-то более простой способ, например, foreach l oop и получить текущий item.someValue?

UPDATE

На основе комментариев, возможно, мне не нужен l oop .

Это пример таблицы

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, вот где я думал, что циклы являются естественным решением.

Эти другие столбцы в основном добавляют orderSecondTime = 24h + orderTime orderThirdTime = orderTime to orderSecondTime и тому подобное.

UPDATE # 2 :

Пример правил:

Если это заказ rTime находится между 08:00 и 10:00:

  • orderSecondTime = orderTime + 60 мин.
  • orderThirdTime = orderSecondTime (вычислено выше) + 60 мин
  • ELSE используйте другой расчет, например, добавить 30 мин.

Что у меня есть

enter image description here

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

What I am trying to calculate

введите описание изображения здесь

1 Ответ

2 голосов
/ 03 августа 2020

Разве вы не сразу после пары 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 полностью не поддерживается уже более года. Вам следует изучить пути обновления как можно скорее, если вы еще не сделали этого.

...