Oracle SQL-从给定列表中选择不同的值

时间:2019-01-26 10:17:02

标签: sql oracle distinct

我已经进行了广泛的搜索,试图找到一种从给定列表中选择表中不存在的不同值的方法,但是似乎没有一种简单的方法。

我想知道这样做是否可行,还是将值放入表中并从中选择一个最简单的解决方案?

这是我要做的事情的要旨:

Select distinct column_name from dual where column_name in ('one','two','two','elephant');

3 个答案:

答案 0 :(得分:6)

双重连接”的替代方法是内置的varchar2数组。 这是示例

select distinct column_value
from   table(
         sys.odcivarchar2list(
           'one','two','two','elephant'
         )
       )

答案 1 :(得分:0)

带有in的构造将不起作用,除非您有一个查询返回指定的所有值甚至更多的值,所以如果您有一组字母,则可以在查询中输入返回所有字母。那会给你这样的东西:

select
  *
from (
  select chr(96 + level) as letter
  from dual
  connect by level <= 26)
where
  letter in ('a', 'a', 'b');

当然,这适用于固定的有限集,例如整个字母,甚至是1到1000之间的数字,但这不是将任何集转换为不同列表的一种方法。

替代:双重联接

您可以使用伪造的表dual选择一个值。您甚至可以合并这些选择,尽管看起来有些麻烦:

select 'a' as MyValue from dual
union select 'a' from dual
union select 'b' from dual

如果您使用union而不是union all,则查询将仅隐式返回不同的值。

替代:分割字符串

如果字符串中包含值,则可以拆分该字符串并返回项目。有多种方法可以做到这一点,但并非开箱即用。您可以看看问题Splitting string into multiple rows,答案将给出各种解决方案。

答案 2 :(得分:0)

尝试这样的事情:

select distinct trim(regexp_substr('a,b,b,c','[^,]+', 1, level) ) value
from dual
connect by regexp_substr('a,b,b,c', '[^,]+', 1, level) is not null