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

时间:2013-04-24 10:32:57

标签: mysql stored-procedures

Appr_ID   Status
----------------
Null      1
3         2
4         3
NULL      4
7         5
NULL      6

我在表格中有两列,其值如上所示。

我需要编写一个存储过程,以便每当Appr_ID列具有Not Null值时,它将从具有多个连接的某些表中获取和显示数据。

Appr_ID列为NULL时,它将再次使用一些不同的条件来获取和显示数据。

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

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

因此,请提出其他想法以完成该方案。

先谢谢,克里希纳

3 个答案:

答案 0 :(得分:0)

如果你需要在一个语句中执行它们两个连接然后使用CASE .... WHEN来决定在输出中使用哪些列。

我的意思的简短例子: -

SELECT a.*, CASE WHEN a.somefield IS NULL THEN b.somefield ELSE c.someotherfield END AS OutputField
FROM SomeTable a
LEFT OUTER JOIN SecondTable b ON a.somefield = b.id
LEFT OUTER JOIN ThirdTable c ON a.somefield = c.id

答案 1 :(得分:0)

您应该使用CASE声明。

例如:

SELECT
  CASE
    WHEN Appr_ID IS NULL THEN (
      SELECT somevalue 
      FROM sometable 
           JOIN ... 
           JOIN ... 
      WHERE something=something)
    ELSE (SELECT somevalue 
          FROM someothertable 
               JOIN ... 
               JOIN ...  
          WHERE something=something)
  END as Your_Result_ColumnName

FROM
  YourTableWithApprIDInIt

如果每个子查询基本上返回相同的结果,而不管主YourTableWithApprIDInIt表中的某个值(例如Appr_ID iself),这将非常有效。这是因为该子查询实际上不会为每一行反复执行;它的结果将由DBMS缓存并重新用于每一行。

但是如果子查询依赖 Appr_ID(这样每个子查询都需要在每一行上重新执行),那么你可能会使用一个子查询,而不是使用子查询。 JOIN代替(在您的主FROM子句中)。

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 ..

如果您愿意, 仍然可以在此方案中使用子查询,但它可能不那么干净(并且可能效率较低,因为DBMS将处理多个逻辑上脱节的结果集 - 尽管我说“可能”,因为DBMS可以正确地优化它。)

我会根据您的具体情况进行测试,看看一种方法是否比另一种产生更好的结果。如果表现甚至是一个因素。


<强>更新

如果您需要根据Appr_ID值为null而选择多个值,则需要为每个值重复case语句主查询中的列,例如:

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 ..

这是连接语法真正开始变得更清晰的时候......但是,如果每个Your_Result_ColumnName_X来自不同的表,并且每个子查询都不依赖于内部的值您的主要外部查询(这样每个只需要评估一次),两个模式中的第一个可能更高效,即使它看起来更干净; - )

但是,再次,在您的特定场景中测试两者是否存在差异,并且可能是由DBMS评估/优化/执行它们是非常相同的(在这种情况下,选择使得语法模式对你最有意义!): - )

答案 2 :(得分:0)

您可以使用CASE WHEN声明

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