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 是任何东西。)
例如,如果下面的代码,某些东西被检查为 NULL
或 NOT 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)
我正在创建一个新的 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 是任何东西。)
例如,如果下面的代码,某些东西被检查为 NULL
或 NOT 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)