具有用户定义类型的SQL语句产生错误
我创建了一个名为具有用户定义类型的SQL语句产生错误,sql,sql-server,user-defined-types,Sql,Sql Server,User Defined Types,我创建了一个名为membertypes的用户定义类型,它由一列类型为int的membertype组成 我有这样一个存储过程: declare @membertypes dbo.MemberTypes; INSERT INTO @membertypes VALUES (1); INSERT INTO @membertypes VALUES (3); declare @membertypecount int = (select cou
membertypes
的用户定义类型,它由一列类型为int
的membertype
组成
我有这样一个存储过程:
declare @membertypes dbo.MemberTypes;
INSERT INTO @membertypes VALUES (1);
INSERT INTO @membertypes VALUES (3);
declare @membertypecount int = (select count(1) from @membertypes)
select username, MiniThumbNail, userID,
from members
where members.membertype in (case when @membertypecount > 0 then (select membertype from @membertypes) else members.membertype end)
它不工作,我收到错误消息:
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时
但是,如果我将代码更改为此,它确实可以工作:-
declare @membertypes dbo.MemberTypes;
INSERT INTO @membertypes VALUES (1);
INSERT INTO @membertypes VALUES (3);
select username, MiniThumbNail, userID,
from members
where members.membertype in (select membertype from @membertypes)
为什么原始代码会产生该错误?case表达式将只返回一个单行值,而子查询可能有多行。所以,case表达式不起作用 因此,您可以使用
left join
:
select username, MiniThumbNail, userID
from members mb left join
@membertypes mt
on mt.membertype = mb.membertype
where (@membertypecount = 0 or mt.membertype is not null);
为什么原始代码会产生这种错误
这是无效的:
case when @membertypecount > 0 then (select membertype from @membertypes) else members.membertype end
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
在情况下,当x然后y
时,y
必须表示一个值,如1
、“苹果”
等。在若干组数据中选择一组输入In时,使用CASE无效。这是您的逻辑:
where members.membertype in (case when @membertypecount > 0
then (select membertype from @membertypes)
else members.membertype
end)
您误解了案例
表达式的含义。大小写表达式是返回单个标量值的表达式。“标量”值具有简单类型,例如整数或字符串。(一些数据库将其扩展为包括元组和数组,但SQL Server不是其中之一。)表达式的其他示例包括算术('1+1'
)、函数(len('abc')
),甚至是简单列
子查询并不简单
幸运的是,没有案例
,您想做的事情很容易:
where members.membertype in (select membertype from @membertypes) or
not exists (select 1 from @membertypes)
请注意,提供一些有用的东西并不是解决这个问题的答案;他已经有了一些有用的东西(
中的),他想知道为什么使用=
不行work@CaiusJard. . . <代码>真
。但是,中的不会做可能不OP
想要的事情<
中的code>将只过滤匹配的行,如果不过滤,则查询将不返回任何行。@CaiusJard好的,但为什么它在第二段代码中工作?对不起,我一直在以=
为例进行解释,当子查询用作表达式时,我本应该关注,但推理是一样的:如果x那么y只能用于返回一个值作为y。放置一个返回多个值的查询无法工作。如果子查询是selectmax
或selecttop1
,SQLserver会允许它go@CaiusJardbut我使用的是“in”语句,所以它肯定是为了处理多个结果而设计的?