首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在select查询中使用变量

在select查询中使用变量
EN

Stack Overflow用户
提问于 2014-05-15 15:37:59
回答 1查看 843关注 0票数 2

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

因此,让我们举一个与在sql fiddle中加载相同的简单示例

代码语言:javascript
复制
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值相同,则递增

查询:

代码语言:javascript
复制
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

代码语言:javascript
复制
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;

我不能执行上面的查询,它给了我错误:

代码语言:javascript
复制
Incorrect syntax near '='.

然后我只是尝试递增数字,以确保我可以在select查询中递增变量值。sqlfiddle

代码语言:javascript
复制
declare @i int =0 
select col1,@i=@i+1  from align1

我得到了错误:

代码语言:javascript
复制
A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operations

即使我使用了LAG(),那么我如何在select语句中有条件地递增或重置变量呢?

所以我想在sql server 2012中得到和mysql一样的结果。

提前谢谢你..

EN

回答 1

Stack Overflow用户

发布于 2014-05-16 14:20:23

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

代码语言:javascript
复制
 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)

结果:

代码语言:javascript
复制
    @i = 3
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23672017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档