Oracle SQL - 从给定字符串形成一个虚拟表以与另一个表连接

Sri*_*m M 1 sql oracle

有没有.字符串.

让我们说吧'foo', 'bar', 'chi', 'xyz', 'moo'.

我想形成一个虚拟表,比如说X用于与另一个表连接,比如Y,其中一个列中包含那些字符串,即名称.尝试通过运行以下查询来提取数据.

select Y.name, Y.age from(**select ('foo', 'bar', 'chi', 'xyz', 'moo') as name**) X left join Y on X.name = Y.name;

我知道**中的文本不是正确的SQL语法,但寻找类似于必须在Oracle SQL中运行查询的东西.

任何建议或想法最受欢迎.

MT0*_*MT0 6

使用VARRAY或集合并加入COLUMN_VALUE伪柱:

SELECT y.*
FROM   TABLE( SYS.ODCIVARCHAR2LIST( 'foo', 'bar', 'chi', 'xyz', 'moo' ) ) t
       INNER JOIN -- or LEFT OUTER JOIN
       y
       ON t.COLUMN_VALUE = y.name;
Run Code Online (Sandbox Code Playgroud)

SYS.ODCIVARCHAR2LIST 是几个预先存在的VARRAY之一,但您可以轻松创建自己的集合:

CREATE TYPE Char3List IS TABLE OF CHAR(3)
/

SELECT y.*
FROM   TABLE( Char3List( 'foo', 'bar', 'chi', 'xyz', 'moo' ) ) t
       INNER JOIN -- or LEFT OUTER JOIN
       y
       ON t.COLUMN_VALUE = y.name;
Run Code Online (Sandbox Code Playgroud)

或者,使用集合(但不是VARRAY类似SYS.ODCIVARCHAR2LIST),您甚至不需要使用连接:

SELECT *
FROM   y
WHERE  name MEMBER OF Char3List( 'foo', 'bar', 'chi', 'xyz', 'moo' );
Run Code Online (Sandbox Code Playgroud)

您甚至可以将其作为外部语言的数组传递给bind参数.