簡體   English   中英

HQL,如果滿足條件則插入兩行

[英]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的附加奇偶校驗列(存儲10 )以區分名為的重復條目

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM