在 where 语句中使用 if

Use if in where statement

我有 4 个 table:

  1. Table_op_type
  2. Table_maintenancetype
  3. Table_repair_time
  4. 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)
      );