2014-09-25 124 views
0

我有一个名为DUMMY_TAB的表,其列COLOR包含逗号分隔值RED,BLUE,WHITE,GREEN,YELLOW。现在我想检查是否存在多种颜色,并且我不知道存储值的顺序。从Oracle数据库中的逗号分隔值获取特定值

我已经使用查询关键词,比如:

SELECT COLOR from DUMMY_TAB WHERE (COLOR LIKE '%GREEN%' OR COLOR LIKE '%VOILET%' OR COLOR LIKE '%ORANGE%'); 

但查询不返回任何东西。我可以在这里得到任何帮助吗?

+2

除了一个事实,即存储在列中的逗号分隔的列表是可怕的做法违反基本正常化,如果表中的数据为你描述,查询您发布将返回该行。如果查询未返回行,则数据不得包含字符串“GREEN”。当您搜索大写字母值时,表格中的数据可能是小写字母吗? – 2014-09-25 11:17:41

+0

我的行有大写逗号分隔值,与我在问题中询问的相同。像GREEN,BLUE,YELLOW – Imran 2014-09-25 11:21:32

+0

如果数据和查询完全按照您显示的那样进行,则查询将返回一行。向我们展示一个独立的示例,复制我们可以在我们的机器上运行的问题。否则,几乎不可能调试出什么问题 – 2014-09-25 11:26:27

回答

1

您应该使用联结表。 SQL有这个伟大的数据结构来存储列表。它被称为。逗号分隔值不是正确的方法。

但是,有时候,你别无选择。您正在查找:

where ',' || 'GREEN' || ',' like ',' || COLOR || ',' 

使用分隔符可确保您可以在列表的开头和末尾找到值。

0

你肯定违反正常化,正如Justin Cave所强调的那样。

此外,最佳做法是将它们存储在表格的列中,而不是全部存储在一个表格中。

我无法复制您的问题陈述。见证据here

create table temp (col varchar2(30)); 

insert into temp values('RED,BLUE,WHITE,GREEN,YELLOW'); 

SELECT * from temp WHERE col LIKE '%GREEN%'; 

COL 
RED,BLUE,WHITE,GREEN,YELLOW