Oracle SQL - Select 来自给定列表的不同值

Oracle SQL - Select distinct values from a given list

我进行了广泛的搜索,试图找到一种方法来 select 从给定列表中获取 table 中不存在的不同值,但似乎没有一个简单的方法这样做的方式。

我想知道这是否有可能以某种方式完成,或者是否是将值放入与那里不同的 table 和 select 中的最简单解决方案?

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

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

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

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

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

备选方案:双重联接

您可以 select 使用假 table dual 的单个值。你甚至可以把这样的 select 并集起来,虽然看起来有点麻烦:

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

如果您使用 union 而不是 union all,查询将隐含地 return 仅不同的值。

备选方案:拆分字符串

如果您有字符串中的值,则可以拆分该字符串和 return 项目。有多种方法可以做到这一点,但不是开箱即用的。您可以查看问题 Splitting string into multiple rows,答案显示了各种解决方案。

尝试这样的事情:

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

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

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