【问题标题】:Case for every second row in a resultset SQL server 2008结果集 SQL Server 2008 中每隔一行的大小写
【发布时间】:2017-05-17 12:05:12
【问题描述】:

我有一个包含许多行的结果集,我想编写一个 case 表达式来比较结果中的每一行,而无需对行号进行硬编码。

结果中的每一行都相互连接。

示例:

1 号 1:2345 号 2:1111

2 号 1:3456 号 2:2222

3 号 1:4567 号 3:3333

4 号 1:5678 号 4:4444

想比较第1行和第2行/第3行和第4行等等..

有什么建议吗?我正在使用 SQL Developer 2008。

【问题讨论】:

  • 查看 LEAD/LAG 函数
  • 编辑您的问题并提供示例数据和所需结果。
  • LEAD/LAG 在 SQL 2008 中不可用
  • 这种比较的性质是什么?输出应该是什么样的?更重要的是,如何 确定顺序。表格本身没有内在的顺序。

标签: sql sql-server-2008 resultset management-studio-express


【解决方案1】:

将相同的数据插入两个不同的#table并使用while循环进行比较,如下所示,

DECLARE @min INT =1,
                  @max INT ,@Table1_number1 INT,@Table1_number2 INT,@Table2_number1 INT,@Table2_number2 INT
CREATE TABLE #Table1(ID INT IDENTITY(1,1),
                            number1 INT,number2 INT)
CREATE TABLE #Table2(ID INT IDENTITY(1,1),
                            number1 INT,number2 INT)
INSERT INTO #Table1(number1,
                    number2)
VALUES(1,
       1), (1,
            1), (2,
                 2)
INSERT INTO #Table2(number1,
                    number2)
VALUES(1,
       1), (1,
            1), (2,
                 2)
SELECT @max=
  (SELECT count(1)
   FROM #Table1) WHILE(@min<=@max) BEGIN
SELECT @Table1_number1=number1,
       @Table1_number2=number2
FROM #Table1
WHERE ID=@min IF(@min=@max) BEGIN
  SELECT @Table2_number1=number1,
         @Table2_number2=number2
  FROM #Table2
  WHERE ID=1 END ELSE BEGIN
  SELECT @Table2_number1=number1,
         @Table2_number2=number2
  FROM #Table2
  WHERE ID=@min+1 END

    IF(@Table1_number1=@Table2_number1
    AND @Table1_number2=@Table2_number2) BEGIN PRINT 'do something' END ELSE BEGIN PRINT '-- do something else' END
    SET @min=@min+1 END
  DROP TABLE #Table1
  DROP TABLE #Table2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多