我已经进行了广泛的搜索,试图找到一种从给定列表中选择表中不存在的不同值的方法,但是似乎没有一种简单的方法。
我想知道这样做是否可行,还是将值放入表中并从中选择一个最简单的解决方案?
这是我要做的事情的要旨:
Select distinct column_name from dual
where column_name in ('one','two','two','elephant');
答案 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