我运行了几个在where子句中使用字符值列表的查询,例如
select *
from table1
where col1 in ('a','b','c')
字符列表经常更改,因此我希望将字符串存储在变量中,并在所有查询中引用该变量,而不是保留字符串的多个副本。我尝试了以下但查询返回零行。
declare @str varchar(50)
select @str = '''a''' + ',' + '''b'''+ ',' + '''c'''
select *
from table1
where col1 in (@str)
@str的值为'a','b','c',但由于某种原因,SQL Server无法识别它。如何构建字符串并将其存储在与in关键字一起使用的变量中?
答案 0 :(得分:0)
可以创建带嵌入引号的字符串。正如Fredou和ChrisS所提到的,@ str被认为是一个字符串。如果@str值与select语句的其余部分连接在一起然后执行,您将获得所需的结果。 SQL小提琴example。
declare @str varchar(50)
declare @sql varchar(MAX)
select @str = '''a''' + ',' + '''b'''+ ',' + '''c'''
Select @sql = 'SELECT * FROM table1 WHERE col1 IN (' + @str + ')'
Exec(@sql)
结果使用@str ='''''' +',' +''''' +',' +''''''
结果使用@str ='''''' +',' +''''''
答案 1 :(得分:0)
SQL中的IN构造作为集合查找,而不是字符串查找。您的单个字符串值为"''''''''''''当你在评论中提到col1 in(@str)的时候正是它正在寻找的......正如Fredou在评论中提到的那样。
相反,您希望使用表变量(或临时表)传递一组值:
declare @tabIn table ( val varchar(10) )
insert @tabIn
(val) values
('a'), ('b'), ('c')
select *
from table1
where
col1 in (select val from @tabIn)
或者,只是直接加入:
declare @tabIn table ( val varchar(10) )
insert @tabIn
(val) values
('a'), ('b'), ('c')
select *
from table1 t1
join @tabIn t2 on
t1.col1 = t2.val