在 Oracle 列中查找字符串时如何添加更多行

How add more rows when find string in column Oracle

是否可以根据 SQL 中的关键字字符串添加更多行?

table一个

PID    PromotionName                                
 1      OUT_EC_D10_V500K_FamilyCare_PROCO
 2      OUT_EC_D5_V50K_Lunchbox_PROCO
 3      OUT_EC_D5_V50K_PROCO

table B

promotion_code     itm_name         quantity

Lunchbox           Item name 1         1
FamilyCare         Item name 2         1
FamilyCare         Item name 3         1
BUY1FREE6          Item name 4         1
HiSummer           Item name 5         1
FamilyCare         Item name 6         1 

示例:

SELECT * FROM A where pid = '1';

SQL 的输出应该是 -

PID   PromotionName                          Itm_name          quantity
 1     OUT_EC_D10_V500K_FamilyCare_PROCO
 2     FamilyCare                           Item name 2         1
 3     FamilyCare                           Item name 3         1
 4     FamilyCare                           Item name 6         1 

如何根据 table B 的 promotion_code 在 table A 的 PromotionName 中查找关键字 'FamilyCare' 的字符串?如果存在,它将在输出中添加更多行

对 SQL 有任何帮助吗?

以下是实现此目的的方法:

SELECT PID,PromotionName, '' as Itm_name, NULL as quantity 
FROM A 
WHERE pid = '1'

UNION

SELECT PID, PROMOTION_NAME, Itm_name, quantity 
FROM 
(SELECT * FROM A inner join B on a.promotionName LIKE '%'||b.promotion_name||'%')
WHERE pid='1'

您必须在两个地方(UNION 之前和之后)更新您的 pid

请注意,表是使用 LIKE 运算符连接的,单词前后都有 %。因此,如果字符串的一部分存在于另一列中,则此连接。

db<>fiddle link 这里

一个选项将开始构建一个子查询分解以及通过 a.promotionName LIKE '%'||b.promotion_code||'%' 条件连接表,同时通过 b.promotion_code = 'FamilyCare' 过滤,然后添加另一个查询以通过 UNION ALL 组合结果集,然后通过ROW_NUMBER()解析函数如

枚举一个id列
WITH ab AS
(
 SELECT a.*, b.* 
   FROM a 
   JOIN b 
     ON a.promotionName LIKE '%'||b.promotion_code||'%'
  WHERE b.promotion_code = 'FamilyCare'   
), ab2 AS
(
 SELECT promotion_code, itm_name, quantity
   FROM ab
 UNION ALL
 SELECT DISTINCT promotionName, NULL, NULL
   FROM ab
)
SELECT ROW_NUMBER() OVER (ORDER BY itm_name NULLS FIRST) AS pid,
       a.*
  FROM ab2 a  

如果最上面的查询不匹配,则不会返回任何行。例如。该查询将检查您提供的文字是否存在

Demo