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

时间:2017-10-10 19:07:09

标签: sql oracle

有N没有。字符串。

让我们说'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中运行查询的东西。

欢迎任何建议或想法。

3 个答案:

答案 0 :(得分: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;

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;

或者,对于一个集合(但不是像VARRAY这样的SYS.ODCIVARCHAR2LIST),您甚至不需要使用联接:

SELECT *
FROM   y
WHERE  name MEMBER OF Char3List( 'foo', 'bar', 'chi', 'xyz', 'moo' );

您甚至可以将其作为an array from an external language传递给绑定参数。

答案 1 :(得分:1)

一个简单的方法是union all

select names.name, Y.age
from (select 'foo' as name from dual union all
      select 'bar' as name from dual union all
      select 'chi' as name from dual union all
      select 'xyz' as name from dual union all
      select 'moo' as name from dual
     ) names left join
     Y
     on names.name = Y.name;

请注意,select已更改为从第一个表中取name,而不是第二个表(毕竟,可能没有匹配)。

答案 2 :(得分:0)

ERROR: Error tagging repo 'refs/remotes/origin/master' :
org.eclipse.jgit.api.errors.NoHeadException: Tag on repository without
HEAD currently not supported hudson.plugins.git.GitException:
org.eclipse.jgit.api.errors.NoHeadException: Tag on repository without
HEAD currently not supported    at
org.jenkinsci.plugins.gitclient.JGitAPIImpl.tag(JGitAPIImpl.java:509)
    at
hudson.plugins.git.GitTagAction$TagWorkerThread.perform(GitTagAction.java:199)
    at hudson.model.TaskThread.run(TaskThread.java:129) Caused by:
org.eclipse.jgit.api.errors.NoHeadException: Tag on repository without
HEAD currently not supported    at
org.eclipse.jgit.api.TagCommand.call(TagCommand.java:137)   at
org.jenkinsci.plugins.gitclient.JGitAPIImpl.tag(JGitAPIImpl.java:507)
    ... 2 more Trying next branch Completed