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