【问题标题】:use variable in select query在选择查询中使用变量
【发布时间】:2023-03-28 13:54:01
【问题描述】:

我想将前一行的列值存储在变量中,然后将此变量值与当前行的列进行比较。在mysql中,例如sqlfiddle

让我们举个简单的例子,就像在 sql fiddle 中加载的一样

create table align1 (col1 varchar(100),col2 varchar(100));

insert into align1 values ('1','1');
insert into align1 values ('1','1');
insert into align1 values ('10','1');
insert into align1 values ('100','1');

我想要实现的是,如果 col1 的值对于前一行和当前行相同,则递增

查询:

select col1,col2,if(@temp1=col1,@i:=@i+1, @i:=1) as  _keycol,@temp1:=col1 from align1,(select @temp1:=null,@i:=0)t

mysql 一切都很完美。

现在我想在 sql server 中实现相同的查询。

在mysql中我使用了会话变量,所以我不需要声明,但在sql server中我需要先声明。

我在 sql server 2012 中尝试了以下查询,sqlfiddle

declare @temp1 varchar(1024)='',@i int =0 
select col1,col2,case when @temp1=col1 then  @i=@i+1 else @i=1 end as  _keycol,@temp1=col1 from align1;

我无法执行上述查询,它给了我错误:

Incorrect syntax near '='.

然后我只是尝试增加数字以确保我能够在选择查询中增加变量值..sqlfiddle:

declare @i int =0 
select col1,@i=@i+1  from align1

我得到了错误:

A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operations

即使我使用 LAG(),我如何在 select 语句中有条件地增加或重置变量。

所以我想在 mysql 的 sql server 2012 中得到相同的结果。

提前谢谢你..

【问题讨论】:

    标签: mysql sql sql-server


    【解决方案1】:

    试试这个。它在 SQL Server 2012 的 SSMS 查询窗口中为我工作。(这是我第一次在这里发帖,如果格式不正确,请原谅我!)

     IF OBJECT_ID('tempdb..#temp') IS NOT NULL  
      DROP TABLE #temp
    
    create table align1 (col1 varchar(100),col2 varchar(100));
    
    insert into align1 values ('1','1');
    insert into align1 values ('1','1');
    insert into align1 values ('10','1');
    insert into align1 values ('100','1');
    insert into align1 values ('100','1');
    insert into align1 values ('300','1');
    insert into align1 values ('500','1');
    insert into align1 values ('500','1');
    
    DECLARE @count INT = 0;
    DECLARE @prev  VARCHAR(100);
    DECLARE @current VARCHAR(100);
    DECLARE @i INT = 0;
    
    SELECT @count = count(*) from align1
    
    SELECT * INTO #temp FROM align1
    SET @current = (SELECT TOP 1 col1 FROM #temp)
    DELETE TOP (1) FROM #temp
    
    WHILE @Count > 0
    BEGIN
    SET @prev = @current;
    SET @current = (SELECT TOP 1 col1 From #temp)
    IF @current = @prev 
       BEGIN
       SET @i = @i + 1;
       END
     DELETE TOP (1) FROM #temp;
     SET @Count = @Count - 1;
    END
    
    PRINT '@i = ' + CONVERT(VARCHAR,@i)
    

    结果:

        @i = 3
    

    【讨论】:

      猜你喜欢
      • 2016-08-20
      • 1970-01-01
      • 2021-07-01
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多