我有一个列表,想知道我的列是否包含任何列表值。
您好,我有一个包含列颜色的表格,其中有一种或多种颜色作为输入: 示例:
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
问候, 尼克
正如我的评论中提到的,尚不完全清楚您在做什么,但我认为您可能希望将其设置为多对多关系。
可以在这里查看小提琴。 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;