【问题标题】:How to iterate on table columns in SQL based on a value?如何根据值迭代 SQL 中的表列?
【发布时间】:2018-04-14 22:41:44
【问题描述】:

我有一个表说 TABLE A,它有 12 列,如下所示:

点 1 点2 第3点 第4点 Point5 ..Point12

现在我必须根据从另一个表 TABLE B 获得的限制对我的表运行更新,然后相应地移动这些列的值

我想做的是

如果限制 = 1

Point1 = 0

如果表 B 的限制是 3 然后我想做以下事情:

Point3 = Point2
Point2 = Point1
Point1 = 0

同样,如果限制是 6,那么应该会发生以下情况

Point6 = Point5
Point5 = Point4
Point4 = Point3
Point3 = Point2
Point2 = Point1
Point1 = 0

限制可以从 1 到 12

现在像上面那样硬编码值是我要做的最后一件事。 如何使用循环动态使用 SQL 来实现这一点?

【问题讨论】:

  • 你自己做了什么?即使你已经硬编码了,你能显示一些代码吗?
  • Gordon,这是与 1 个单行有关的数据,即一个单记录。此数据无法从列转换为行
  • 思路是将值从低值点列转移到高值点列
  • @geekstudent 这些数据如何在行中工作:data.stackexchange.com/stackoverflow/query/751270/… 这并不能完全回答您的问题,但可以解释更多的建议(我希望:D)
  • @geekstudent 我改进了这个例子data.stackexchange.com/stackoverflow/query/751270/… - 并不是说​​这是这项技术的最佳用途,只是想帮助讨论

标签: sql-server for-loop while-loop dynamic-sql


【解决方案1】:

你可以试试这个:

DECLARE @DataSource TABLE
(   
    [ID] INT IDENTITY (1,1)
   ,[Point1] INT
   ,[Point2] INT
   ,[Point3] INT
   ,[Point4] INT
   ,[Point5] INT
   ,[Point6] INT
   ,[Point7] INT
   ,[Point8] INT
   ,[Point9] INT
   ,[Point10] INT
   ,[Point11] INT
   ,[Point12] INT
);

INSERT INTO @DataSource ([Point1], [Point2], [Point3], [Point4], [Point5], [Point6], [Point7], [Point8], [Point9], [Point10], [Point11], [Point12])
VALUES (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);


DECLARE @Limit TINYINT = 5;

UPDATE @DataSource
SET [Point1] = IIF(@Limit >= 1, 0, [Point1])
   ,[Point2] = IIF(@Limit >= 2, [Point1], [Point2])
   ,[Point3] = IIF(@Limit >= 3, [Point2], [Point3])
   ,[Point4] = IIF(@Limit >= 4, [Point3], [Point4])
   ,[Point5] = IIF(@Limit >= 5, [Point4], [Point5])
   ,[Point6] = IIF(@Limit >= 6, [Point5], [Point6])
   ,[Point7] = IIF(@Limit >= 7, [Point6], [Point7])
   ,[Point8] = IIF(@Limit >= 8, [Point7], [Point8])
   ,[Point9] = IIF(@Limit >= 9, [Point8], [Point9])
   ,[Point10] = IIF(@Limit >= 10, [Point9], [Point10])
   ,[Point11] = IIF(@Limit >= 11, [Point10], [Point11])
   ,[Point12] = IIF(@Limit >= 12, [Point11], [Point12])

SELECT *
FROM @DataSource;

另一种技术是使用动态 T-SQL 语句,以便仅更新您需要的列并排除此 IIF 语句。如果您在2012 下使用SQL Version,则必须将IIFCASE WHEN 语句切换:

UPDATE @DataSource
SET [Point1] = CASE WHEN @Limit >= 1 THEN 0 ELSE [Point1] END
   ,[Point2] = CASE WHEN @Limit >= 2 THEN [Point1] ELSE [Point2] END
   ,[Point3] = CASE WHEN @Limit >= 3 THEN [Point2] ELSE [Point3] END
   ,[Point4] = CASE WHEN @Limit >= 4 THEN [Point3] ELSE [Point4] END
   ,[Point5] = CASE WHEN @Limit >= 5 THEN [Point4] ELSE [Point5] END
   ,[Point6] = CASE WHEN @Limit >= 6 THEN [Point5] ELSE [Point6] END
   ,[Point7] = CASE WHEN @Limit >= 7 THEN [Point6] ELSE [Point7] END
   ,[Point8] = CASE WHEN @Limit >= 8 THEN [Point7] ELSE [Point8] END
   ,[Point9] = CASE WHEN @Limit >= 9 THEN [Point8] ELSE [Point9] END
   ,[Point10] = CASE WHEN @Limit >= 10 THEN [Point9] ELSE [Point10] END
   ,[Point11] = CASE WHEN @Limit >= 11 THEN [Point10] ELSE [Point11] END
   ,[Point12] = CASE WHEN @Limit >= 12 THEN [Point11] ELSE [Point12] END

【讨论】:

    猜你喜欢
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    相关资源
    最近更新 更多