在 where 语句中使用 if
Use if in where statement
我有 4 个 table:
- Table_op_type
- Table_maintenancetype
- Table_repair_time
- Table_repair_type
每个 table 都有一列可以是真或假,我有一个 Table_maintenancereport
有很多列和 4 列在 Table_maintenancereport
从 4 up [=38 给出的外键中=] 当我 select Table_maintenancereport
和每个 table 中的一行是真正的代码工作正常但是当从 table 返回多于一行时给出此错误。
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
我该如何解决?
我的代码是:
SELECT *
FROM Table_maintenancereport
WHERE mtypeid IN (IIF(@smtype = 1, (SELECT Table_maintenancetype.id FROM Table_maintenancetype WHERE enable_search = 1), mtypeid))
AND op_typeid IN (IIF(@sop IN (1), (SELECT Table_op_type.id FROM Table_op_type WHERE enable_search = 1), op_typeid))
AND repaire_timeid IN (IIF(@stime IN (1), (SELECT Table_repair_time.id FROM Table_repair_time WHERE enable_search = 1), repaire_timeid))
AND repaire_typeid IN (IIF(@stype = 1, (SELECT Table_repair_type.id FROM Table_repair_type WHERE enable_search = 1), repaire_typeid));
也许您可以在 where 子句中使用 CASE WHEN
语句,例如:
select
*
from
Table_maintenancereport
where
case
when @smtype = 1 then mtypeid in (
select Table_maintenancetype.id
from
Table_maintenancetype
where
enable_search = 1)
else mtypeid = mtypeid end
....
如果我正确地解释了您正在尝试做的事情:
SELECT *
FROM Table_maintenancereport mr
LEFT OUTER JOIN Table_maintenancetype mt ON mr.mtypeid = mt.id AND enable_search = 1
LEFT OUTER JOIN Table_op_type ot ON mr.op_typeid = ot.id AND enable_search = 1
LEFT OUTER JOIN Table_repair_time rt ON mr.repaire_timeid = rt.id AND enable_search = 1
LEFT OUTER JOIN Table_repair_type rty ON mr.repaire_typeid = rty.id AND enable_search = 1
WHERE (ISNULL(@smtype,-1) != 1 OR mt.id IS NOT NULL)
AND (ISNULL(@sop,-1) != 1 OR ot.id IS NOT NULL)
AND (ISNULL(@stime,-1) != 1 OR rt.id IS NOT NULL)
AND (ISNULL(@stype,-1) != 1 OR rty.id IS NOT NULL)
所以对于每个@variable,如果它被设置为 1,相应的字段必须是启用搜索的 id 之一才能出现在输出中。如果一个变量不设置为1,那么它不会过滤相应的字段。
您需要修复 where
条件。您可以使用基本逻辑运算符执行此操作。 iif()
或 case()
表达式不能返回集合。
所以:
WHERE (@smtype <> 1 OR
mtypeid IN (SELECT Table_maintenancetype.id FROM Table_maintenancetype WHERE enable_search = 1)
) AND
(@sop <> 1 OR
op_typeid IN (SELECT Table_op_type.id FROM Table_op_type WHERE enable_search = 1)
) AND
(@stime <> 1 OR
repaire_timeid IN (SELECT Table_repair_time.id FROM Table_repair_time WHERE enable_search = 1)
) AND
(@stype <> 1 OR
repaire_typeid IN (SELECT Table_repair_type.id FROM Table_repair_type WHERE enable_search = 1)
);
我有 4 个 table:
- Table_op_type
- Table_maintenancetype
- Table_repair_time
- Table_repair_type
每个 table 都有一列可以是真或假,我有一个 Table_maintenancereport
有很多列和 4 列在 Table_maintenancereport
从 4 up [=38 给出的外键中=] 当我 select Table_maintenancereport
和每个 table 中的一行是真正的代码工作正常但是当从 table 返回多于一行时给出此错误。
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
我该如何解决?
我的代码是:
SELECT *
FROM Table_maintenancereport
WHERE mtypeid IN (IIF(@smtype = 1, (SELECT Table_maintenancetype.id FROM Table_maintenancetype WHERE enable_search = 1), mtypeid))
AND op_typeid IN (IIF(@sop IN (1), (SELECT Table_op_type.id FROM Table_op_type WHERE enable_search = 1), op_typeid))
AND repaire_timeid IN (IIF(@stime IN (1), (SELECT Table_repair_time.id FROM Table_repair_time WHERE enable_search = 1), repaire_timeid))
AND repaire_typeid IN (IIF(@stype = 1, (SELECT Table_repair_type.id FROM Table_repair_type WHERE enable_search = 1), repaire_typeid));
也许您可以在 where 子句中使用 CASE WHEN
语句,例如:
select
*
from
Table_maintenancereport
where
case
when @smtype = 1 then mtypeid in (
select Table_maintenancetype.id
from
Table_maintenancetype
where
enable_search = 1)
else mtypeid = mtypeid end
....
如果我正确地解释了您正在尝试做的事情:
SELECT *
FROM Table_maintenancereport mr
LEFT OUTER JOIN Table_maintenancetype mt ON mr.mtypeid = mt.id AND enable_search = 1
LEFT OUTER JOIN Table_op_type ot ON mr.op_typeid = ot.id AND enable_search = 1
LEFT OUTER JOIN Table_repair_time rt ON mr.repaire_timeid = rt.id AND enable_search = 1
LEFT OUTER JOIN Table_repair_type rty ON mr.repaire_typeid = rty.id AND enable_search = 1
WHERE (ISNULL(@smtype,-1) != 1 OR mt.id IS NOT NULL)
AND (ISNULL(@sop,-1) != 1 OR ot.id IS NOT NULL)
AND (ISNULL(@stime,-1) != 1 OR rt.id IS NOT NULL)
AND (ISNULL(@stype,-1) != 1 OR rty.id IS NOT NULL)
所以对于每个@variable,如果它被设置为 1,相应的字段必须是启用搜索的 id 之一才能出现在输出中。如果一个变量不设置为1,那么它不会过滤相应的字段。
您需要修复 where
条件。您可以使用基本逻辑运算符执行此操作。 iif()
或 case()
表达式不能返回集合。
所以:
WHERE (@smtype <> 1 OR
mtypeid IN (SELECT Table_maintenancetype.id FROM Table_maintenancetype WHERE enable_search = 1)
) AND
(@sop <> 1 OR
op_typeid IN (SELECT Table_op_type.id FROM Table_op_type WHERE enable_search = 1)
) AND
(@stime <> 1 OR
repaire_timeid IN (SELECT Table_repair_time.id FROM Table_repair_time WHERE enable_search = 1)
) AND
(@stype <> 1 OR
repaire_typeid IN (SELECT Table_repair_type.id FROM Table_repair_type WHERE enable_search = 1)
);