像 COALESCE 之类的复杂查询?

Something like COALESCE for complicated query?

假设我有一个表 1:

column1|column2|state|
-------|-------|-----|
test1  |      2|    0|
test1  |      3|    0|
test1  |      1|    1|
test2  |      2|    1|
test2  |      1|    2|

我想 select(实际上是删除,但我使用 select 进行测试)所有不具有唯一 column1 且不 select 的列(实际保留)仅具有以下行:

  1. state = 0 和 column2 中的最小值,
  2. 如果不存在 state = 0 的行,则为 column2 中具有最小值的行。

所以 select 的结果应该是:

column1|column2|state|
-------|-------|-----|
test1  |      3|    0|
test1  |      1|    1|
test2  |      2|    1|

保留的行(在删除的情况下)应该是:

column1|column2|state|
-------|-------|-----|
test1  |      2|    0|
test2  |      1|    2|

我试图通过以下方式实现它(不起作用):

SELECT * FROM table1 AS result1
    WHERE
        result1.column1 IN
        (SELECT
            result2.column1
        FROM
            table1 AS result2
        WHERE /*part that works*/)
    AND
        result1.column2 >
        (SELECT
            min(result3.column2)
        FROM
            table1 AS result3
        WHERE (COALESCE(
            result3.column1 = result1.column1 
        AND
            result3.state = 0,

        WHERE
            result3.column1 = result1.column1 
        )))

我想不通的部分在后面result1.column2 >
我想比较 result1.column2

的结果
  1. 结果集中的最小值,其中 it3.state = 0
  2. 如果 1. 不存在,则使用没有 it3.state = 0 条件的类似结果集中的最小值。

这是我的问题,我希望它是有道理的。也许可以用更 efficient/neater 的方式完全重写。
你能帮我解决这个问题吗?

这是你想要的吗?

SELECT
        *
  FROM
        table1 AS result1
 WHERE
        result1.column1 IN (SELECT result2.column1
                              FROM table1 AS result2
                             WHERE /*part that works*/)
   AND  result1.column2 > COALESCE( ( SELECT min(result3.column2)
                                        FROM table1 AS result3
                                       WHERE result3.column1 = result1.column1 
                                         AND result3.state = 0 )
                                   ,( SELECT min(result3.column2)
                                        FROM table1 AS result3
                                       WHERE result3.column1 = result1.column1  )
                                  )

;