输入是否有列表中的内容?

问题描述 投票:0回答:1

我有一个列表,想知道我的列是否包含任何列表值。

您好,我有一个包含列颜色的表格,其中有一种或多种颜色作为输入: 示例:

Column : Colors
Row 1  : RED
Row 2  : RED and GREEN
Row 3  : RED and ORANGE
Row 4  : ORANGE
Row 5  : GREEN AND MAGENTA
Row 6  : ORANGE AND BLACK

...... 我的同事给了我一份包含 25 种独特颜色的列表,并想知道我的表格中是否有这些颜色。 我这样做了:

select 
        colors
        , case when colors like '%GREEN%' then 1
               when colors like '%RED%' then 1
               when colors like '%PURPLE%' then 1
               ...
               else 0
               end found_colors
from        my_table

但是你可以看到这效率不高,因为我必须手动输入每个喜欢和颜色。 我尝试存在,但它有 0 作为“红色和绿色”的输出。 我相信有更好的方法来做到这一点。 有什么建议么? 顺便说一句,我正在使用 pl/sql

问候, 尼克

sql oracle
1个回答
0
投票

正如我的评论中提到的,尚不完全清楚您在做什么,但我认为您可能希望将其设置为多对多关系。

可以在这里查看小提琴。 https://dbfiddle.uk/jEPvtHxe

设置两个表和一个查找表。

CREATE TABLE Color (
    id NUMBER,
    color VARCHAR2(50)
);


CREATE TABLE  RowTable(
  id Number,
  name VARCHAR2(50)
  );

 CREATE TABLE ColorRowLookup(
   id Number,
   colorId Number,
   RowTableId Number
   );

然后在第一个查询中显示每行的颜色,您可以使用 Oracle 的 ListAgg 函数。

SELECT 
    rt.name AS "Row",  rt.id AS "Row ID",
    LISTAGG(clr.color, ' AND ') WITHIN GROUP (ORDER BY clr.color) AS "Color"
FROM 
    RowTable rt
JOIN 
    ColorRowLookup crl ON rt.id = crl.RowTableId
JOIN 
    Color clr ON crl.colorId = clr.id
GROUP BY 
     rt.id, rt.name
ORDER BY 
    rt.id;

计算颜色数量的第二个查询是一个简单的左连接。

SELECT 
    clr.color AS "Color",
    COUNT(crl.colorId) AS "Count"
FROM 
    Color clr
LEFT JOIN 
    ColorRowLookup crl ON clr.id = crl.colorId
GROUP BY 
    clr.color
ORDER BY 
    clr.color;
© www.soinside.com 2019 - 2024. All rights reserved.