找到第一个结果时短路 UNION 查询

Mat*_*nis 4 sql postgresql

我构建了一个非常基本的 UNION 查询,以确定传递到我的查询中的 UUID 的“类型”,如下所示:

(
  SELECT
  CASE WHEN id IS NOT NULL THEN 'player_id' ELSE '' END AS uuid_type 
  FROM db.players
  WHERE id = $1
)
UNION
(
  SELECT
  CASE WHEN id IS NOT NULL THEN 'game_id' ELSE '' END AS uuid_type 
  FROM db.games
  WHERE id = $1
)
UNION
(
  SELECT
  CASE WHEN id IS NOT NULL THEN 'location_id' ELSE '' END AS uuid_type 
  FROM db.locations
  WHERE id = $1
)
UNION
(
  SELECT
  CASE WHEN id IS NOT NULL THEN 'promo_id' ELSE '' END AS uuid_type 
  FROM db.promos
  WHERE id = $1
)
Run Code Online (Sandbox Code Playgroud)

有没有办法“短路”此查询,以便在找到结果时停止。例如,如果第一个子查询成功并uuid_type设置为player_id“我希望查询停止”,因为现在不需要检查其他三个表。

Cod*_*odo 5

我没有可用的 Postgres 来测试它。但它应该像这样工作:

SELECT t.uuid_type
FROM (
    (
      SELECT
      CASE WHEN id IS NOT NULL THEN 'player_id' ELSE '' END AS uuid_type 
      FROM db.players
      WHERE id = $1
    )
    UNION ALL
    (
      SELECT
      CASE WHEN id IS NOT NULL THEN 'game_id' ELSE '' END AS uuid_type 
      FROM db.games
      WHERE id = $1
    )
    UNION ALL
    (
      SELECT
      CASE WHEN id IS NOT NULL THEN 'location_id' ELSE '' END AS uuid_type 
      FROM db.locations
      WHERE id = $1
    )
    UNION ALL
    (
      SELECT
      CASE WHEN id IS NOT NULL THEN 'promo_id' ELSE '' END AS uuid_type 
      FROM db.promos
      WHERE id = $1
    )
) t LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

LIMIT 1将结果限制为单行。通过替换UNIONwith UNION ALL,查询应该更加高效,并且不再需要识别和删除重复项。

  • @Codo:它将短路“UNION ALL”,但不是“UNION”(它将运行所有子查询并在应用限制之前过滤掉重复项)。这是一个[演示](http://rextester.com/DXSG68122);正如你所看到的,第二个查询的“Seq scan on b”节点显示“从未执行”。 (3认同)