Mysql 如何在if条件下使用列值?

Mysql 如何在if条件下使用列值?,mysql,stored-procedures,Mysql,Stored Procedures,我在一个表中有两列,它们的值如上所示 我需要编写一个存储过程,这样每当Appr\u ID列有一个Not Null值时,它就会从某些具有多个联接的表中获取和显示数据 当Appr\u ID列为空时,它将不得不再次使用一些不同的条件来获取和显示数据 我的问题是,当我尝试使用if-else语句时,不可能在if语句中使用列值作为条件,如 Appr_ID Status ---------------- Null 1 3 2 4 3 NULL 4 7

我在一个表中有两列,它们的值如上所示

我需要编写一个存储过程,这样每当
Appr\u ID
列有一个Not Null值时,它就会从某些具有多个联接的表中获取和显示数据

Appr\u ID
列为空时,它将不得不再次使用一些不同的条件来获取和显示数据

我的问题是,当我尝试使用
if
-
else
语句时,不可能在if语句中使用列值作为条件,如

Appr_ID   Status
----------------
Null      1
3         2
4         3
NULL      4
7         5
NULL      6
因此,请提出实现该场景的备选方案


提前谢谢你,奎师那,如果你需要在一个语句中完成,请同时完成两个连接,然后使用用例。。。。何时决定在输出中使用哪些列

举个简单的例子来说明我的意思:-

If Appr_ID is Null then
  Select...
Else
  Select...

您应该使用
CASE
语句

例如:

如果每个子查询基本上返回相同的结果,而不考虑主
yourtablewithappridit
表(例如
Appr\u ID
iself)中的某些值,这将非常有效。这是因为子查询实际上不会对每一行反复执行;它的结果将被DBMS缓存并重新用于每一行

但是如果子查询依赖于
Appr\u ID
(这样每个子查询都需要在每行上重新执行),那么您可能会使用
JOIN
(在主
FROM
子句中)而不是使用子查询

如果需要,您仍然可以在这个场景中使用子查询,但它可能不那么干净(而且可能效率较低,因为DBMS将处理多个逻辑上不连贯的结果集-尽管我说“可能”,因为DBMS可能会对此进行适当优化)

我会在您的特定场景下进行测试,看看一种方法是否比另一种方法产生更好的结果。如果性能甚至是一个因素


更新:

如果需要根据
Appr\u ID
值是否为空选择多个值,则需要对主查询中的每一列重复
case
语句,例如:

SELECT
  CASE
    WHEN a.Appr_ID IS NULL THEN b.somevalue 
    ELSE c.somevalue
  END as Your_Result_ColumnName

FROM
  YourTableWithApprIDInIt a
  JOIN sometable b ON a.x = b.x
  JOIN ... ON ..

  JOIN someothertable c ON a.x = c.x
  JOIN ... ON ..

这是连接语法真正开始看起来更清晰的时候。。。但是,同样,如果
您的\u Result\u ColumnName\u X
都来自不同的表,并且这些子查询中的每一个都不依赖于主外部查询中的值(因此每个查询只需要计算一次),那么这两个模式中的第一个可能会更有效,即使它看起来不那么干净;-)


但同样,在您的特定场景中测试这两种语言是否有差异,可能是DBMS对它们进行了评估/优化/执行,使它们完全相同(在这种情况下,请选择对您最有意义的语法模式!):-)

您可以使用
case WHEN
语句

SELECT
  CASE
    WHEN a.Appr_ID IS NULL THEN b.somevalue_1 
    ELSE c.somevalue_1
  END as Your_Result_ColumnName_1,

  CASE
    WHEN a.Appr_ID IS NULL THEN b.somevalue_2
    ELSE c.somevalue_2
  END as Your_Result_ColumnName_2,

  ...

FROM
  YourTableWithApprIDInIt a
  JOIN sometable b ON a.x = b.x
  JOIN ... ON ..

  JOIN someothertable c ON a.x = c.x
  JOIN ... ON ..

你能提供更多的信息吗谢谢你的想法。但是我使用它有个问题。案例中使用的Select查询必须返回多个列。因此,如何从单个case语句中获取多个列。请告知。再次感谢!!!根据Appr_id是否为空,您是否可以发布其他表以及从中获得哪些数据。
SELECT
  CASE
    WHEN a.Appr_ID IS NULL THEN b.somevalue 
    ELSE c.somevalue
  END as Your_Result_ColumnName

FROM
  YourTableWithApprIDInIt a
  JOIN sometable b ON a.x = b.x
  JOIN ... ON ..

  JOIN someothertable c ON a.x = c.x
  JOIN ... ON ..
SELECT
  CASE
    WHEN Appr_ID IS NULL THEN (
      SELECT somevalue_1
      FROM sometable_1
           JOIN ... 
           JOIN ... 
      WHERE something=something)
    ELSE (SELECT somevalue_1
          FROM someothertable_1
               JOIN ... 
               JOIN ...  
          WHERE something=something)
  END as Your_Result_ColumnName_1,

  CASE
    WHEN Appr_ID IS NULL THEN (
      SELECT somevalue_2
      FROM sometable_2
           JOIN ... 
           JOIN ... 
      WHERE something=something)
    ELSE (SELECT somevalue_2
          FROM someothertable_2
               JOIN ... 
               JOIN ...  
          WHERE something=something)
  END as Your_Result_ColumnName_2,

  ...

FROM
  YourTableWithApprIDInIt
SELECT
  CASE
    WHEN a.Appr_ID IS NULL THEN b.somevalue_1 
    ELSE c.somevalue_1
  END as Your_Result_ColumnName_1,

  CASE
    WHEN a.Appr_ID IS NULL THEN b.somevalue_2
    ELSE c.somevalue_2
  END as Your_Result_ColumnName_2,

  ...

FROM
  YourTableWithApprIDInIt a
  JOIN sometable b ON a.x = b.x
  JOIN ... ON ..

  JOIN someothertable c ON a.x = c.x
  JOIN ... ON ..
SELECT 
 CASE 
   WHEN a.Appr_ID IS NULL THEN  b.somevalue
   ELSE c.somevalue
 END AS ResultColumn

INNER JOIN TABLE b ON a.somecolumn = b.somecolumn
INNER JOIN TABLE c ON a.somecolumn = c.somecolumn