SQL if 语句到来自不同表的 select 个项目

SQL if statement to select items form different tables

我正在创建一个新的 table 加入 3 个不同的 table。问题是我有一些数据,我想将 select 的 other_info 分成两个不同的 table。 table_1 优先于 table_2,但 table_1 中可能存在缺失值。所以,如果 table_1 中的值不为空,我想 select box 的值;如果 table_1 中的值不为空,我想 select 从 table_2 中获取不存在。

这是我非常简化的代码,但我认为足以看出我想做什么。我在 with 中写了一个 IF ... ELSE 语句,这是我得到的错误:

Syntax error: Expected "(" or keyword SELECT or keyword WITH but got keyword IF at [26:5]

此外,我在 if 的条件语句中尝试了不同的方法,但其中 none 是我所期望的。这是代码:

CREATE OR REPLACE TABLE `new_table`
PARTITION BY
  Current_date
AS (
  WITH info AS (
    SELECT
      Date AS Day,
      Box,
    FROM
      `table_1`
  ),
  other_info AS (
    IF (...)
        BEGIN{
        SELECT
          Date AS Day,
          Box
        FROM
          `table_1`}
        END
    ELSE
        BEGIN{
        SELECT
          Date AS Day,
          Box
        FROM
          `table_2`}
        END
  )
  SELECT
    Date
    Box
    Box_description
  FROM
    `table_3`
    LEFT JOIN info(Day)
    LEFT JOIN other_info(Day)
)

代替 if...,您可以这样做(在 MySQL 中):

SELECT *
FROM table1

UNION ALL

SELECT *
FROM table2 WHERE `date` NOT IN (SELECT `date` FROM table1)

我不确定(如:我没有测试),但我认为这在 google-bigquery

中也是可能的

参见:DBFIDDLE

您将无法在 CTE 或 Create-Table-As 中嵌入 IF

另一种结构可以是将两个查询与互斥的 WHERE 子句结合起来... (这样两个查询中只有一个 return 是任何东西。)

例如,如果下面的代码,某些东西被检查为 NULLNOT NULL,因此两者中只有一个可以 return 数据。

WITH
  info AS
(
  SELECT
    Date AS Day,
    Box,
  FROM
    `table_1`
),
  other_info AS
(
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  THIS BIT
  --------------------------------------------------------------------------------
  SELECT
    Date AS Day,
    Box
  FROM
    `table_1`
  WHERE
    (SELECT MAX(x) FROM y) IS NULL

  UNION ALL

  SELECT
    Date AS Day,
    Box
  FROM
    `table_2`
  WHERE
    (SELECT MAX(x) FROM y) IS NOT NULL
  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
)
SELECT
  Date
  Box
  Box_description
FROM
  `table_3`
  LEFT JOIN info(Day)
  LEFT JOIN other_info(Day)