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...
因此,请提出其他想法以完成该方案。
先谢谢,克里希纳
答案 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