1

我正在尝试使以下代码更小。这可能吗?

select a.*
from table1 a
WHERE a."cola1" = 'valuea1'
UNION ALL
select a.*
from tablea1 a
inner join tablea2 b on a."cola2" = b."colb2"
WHERE a."cola1" = 'valuea2'
  and b."colb3" = 'valueb3'

实际上,我正在从 table1 中查找 value1 或 value2 的记录,但是对于匹配 value2 的记录,我想应用 1 个额外的条件,该条件涉及到第二个表的连接可以在没有 UNION 子句的情况下完成吗?

下面是一个骨架或我正在尝试编写的代码......但它不能自然地工作。

select a.*
from table1 a
inner join table2 b on a."cola1" = b."COLb1"
WHERE a."cola2" IN ('valuea1','valuea2')
  and 
  CASE 
    WHEN a."cola2" = 'valuea2' THEN b."colb1" = 'valueb3'
    ELSE 1=1
  END CASE
4

4 回答 4

5

我认为CASE语句在连接条件下有效,但我不确定。但这对你有用吗?

select *
  from table1 a
 where a.cola1 = 'valuea1'
    or (a.cola1 = 'valuea2'
        and Exists(select 1
                     from table2 b
                    where a.cola2 = b.colb2
                      and b.colb3 = 'valueb3'
                   )
        )

编辑:这不是简单的工作吗?

select a.*
  from table1 a
  Left Outer Join table2 b On (a.cola2 = b.colb2)
 where a.cola1 = 'valuea1'
    or (a.cola1 = 'valuea2' and b.colb3 = 'valueb3')
于 2009-01-09T11:35:01.020 回答
4

总的来说,您应该遵循 Hosam 完全重写谓词的建议。但是为了进一步解释你原来的问题,问题是在 SQL 中, CASE .. END 是一个表达式,只能在可以使用任何其他表达式的地方使用。像“a=b”这样的条件是由逻辑运算符连接的两个表达式。您可能想将其视为布尔表达式,但这不是 SQL 看待它的方式。

您可以使用 CASE 作为条件中的两个表达式之一来完成您想要的操作,如下所示:

WHERE a."cola2" IN ('valuea1','valuea2')
  and 
  b."colb1" = CASE 
                WHEN a."cola2" = 'valuea2' THEN 'valueb3'
                ELSE b."colb1"
              END CASE

(如果 colb1 可能包含 NULL,则需要修改以处理它。)

于 2009-01-09T14:09:44.820 回答
0

您可以通过使用左连接和 where 条件来实现这一点

select a.*
from table1 a
left join tablea2 b on a."cola2" = b."colb2"
WHERE a."cola1" = 'valuea2'
  and ( b."colb2" is null or b."colb3" = 'valueb3' )
于 2016-12-06T22:18:33.490 回答
-1

OP:我有一个接近的小型解决方法(这可能只在这是一个内部连接的情况下才有效。)

select a.* from table1 a inner join table2 b on a."cola1" = b."COLb1" WHERE (a."cola2" = 'valuea1') OR (a."cola2" = 'valuea2' and b." colb1" = 'valueb3')

有时,写出代码会引发一些另类的想法。自我治疗之类的。感谢您的输入。

于 2009-01-09T11:44:49.387 回答