SQL 具有用户定义类型的语句产生错误

SQL statement with user defined type produces error

我创建了一个名为 membertypes 的用户定义类型,它包含一列名为 membertype

int 类型

我有一个这样的存储过程:

        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)

它不起作用,我收到错误消息:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

但是,如果我将代码更改为此它确实有效:-

        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 表达式将 return 只有一个值,单行,而子查询可能有多行。所以,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);

Why does the original code produce that error?

这是无效的:

case when @membertypecount > 0 then (select membertype from @membertypes) else members.membertype end
                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

CASE WHEN x THEN y 中,y 必须表示单个值,如 1'apple' 等。在多个 CASE WHEN 中进行选择是无效的要输入 IN 的数据集。

这是你的逻辑:

   where members.membertype in (case when @membertypecount > 0 
                                     then (select membertype from @membertypes)
                                     else members.membertype 
                                 end)

您误解了 case 表达式的含义。 case 表达式是 returns 单个标量值的表达式。 "scalar" 值具有简单类型,例如整数或字符串。 (一些数据库将其扩展为包括元组和数组,但 SQL Server 不是其中之一。)表达式的其他示例是算术 ('1 + 1')、函数 (len('abc')),甚至简单的列。

子查询不简单

幸运的是,没有case你想做的事很容易:

where members.membertype in (select membertype from @membertypes) or
      not exists (select 1 from @membertypes)