[英]HQL, insert two rows if a condition is met
我在Hive中有名為 table_persons 的下表:
+--------+------+------------+
| people | type | date |
+--------+------+------------+
| lisa | bot | 19-04-2022 |
| wayne | per | 19-04-2022 |
+--------+------+------------+
如果類型是“bot”,我必須在表 d1_info 中添加兩行,否則如果類型是“per”,我只需要添加一行,所以結果如下:
+---------+------+------------+
| db_type | info | date |
+---------+------+------------+
| x_bot | x | 19-04-2022 |
| x_bnt | x | 19-04-2022 |
| x_per | b | 19-04-2022 |
+---------+------+------------+
如果滿足此條件,如何添加兩行? 什么時候可以?
您可以嘗試使用聯合來合並或復制帶有bot
的行。 下面的例子結合了第一個選擇所有記錄的查詢和第二個查詢只選擇那些帶有bot
的查詢。
編輯
為了回應編輯過的問題,我添加了一個名為original
的附加奇偶校驗列(存儲1
或0
)以區分名為的重復條目
SELECT
p1.*,
1 as original
FROM
table_persons p1
UNION ALL
SELECT
p1.*,
0 as original
FROM
table_persons p1
WHERE p1.type='bot'
然后,您可以使用上述查詢作為子查詢或 CTE 將其插入到您的其他表d1_info
中,並使用所需的轉換 CASE 表達式,例如
INSERT INTO d1_info
(`db_type`, `info`, `date`)
WITH merged_data AS (
SELECT
p1.*,
1 as original
FROM
table_persons p1
UNION ALL
SELECT
p1.*,
0 as original
FROM
table_persons p1
WHERE p1.type='bot'
)
SELECT
CONCAT('x_',CASE
WHEN m1.type='per' THEN m1.type
WHEN m1.original=1 AND m1.type='bot' THEN m1.type
ELSE 'bnt'
END) as db_type,
CASE
WHEN m1.type='per' THEN 'b'
ELSE 'x'
END as info,
m1.date
FROM
merged_data m1
ORDER BY m1.people,m1.date;
在此處查看工作演示數據庫小提琴
我想你想要的是創建一個新表來捕獲你的邏輯。 這將簡化您的查詢並使您可以輕松添加新類型,而無需編輯 case 語句的邏輯。 它還可以使以后查看您的邏輯更加清晰。
CREATE TABLE table_persons (
`people` VARCHAR(5),
`type` VARCHAR(3),
`date` VARCHAR(10)
);
INSERT INTO table_persons
VALUES
('lisa', 'bot', '19-04-2022'),
('wayne', 'per', '19-04-2022');
CREATE TABLE info (
`type` VARCHAR(5),
`db_type` VARCHAR(5),
`info` VARCHAR(1)
);
insert into info
values
('bot', 'x_bot', 'x'),
('bot', 'x_bnt', 'x'),
('per','x_per','b');
然后你可以輕松地加入:
select
info.db_type,
info.info,
persons.date date
from
table_persons persons inner join info
on
info.type = persons.type
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.