5

我正在寻找一种在不查询实际表的情况下运行(Oracle)SQL 的可能性。在这里,我找到了 DUAL 表的提示。那还不错。但我正在寻找一个简短的解决方案来从“无处”中选择多行。那可能吗?这是我能想到的最短查询,它可以满足我的需要:

Select 1, 'foo' FROM DUAL union 
Select 2, 'bar' FROM DUAL union  
Select 3, 'more stuff' FROM DUAL

但是,如果我想在结果中包含更多行,那就很不方便了。有没有更短的方法?就像是

Select 1, 'foo'; 2, 'bar'; 3, 'more stuff' from dual 
or 
Select * from (1, 'foo') union (2, 'bar') union (3, 'more stuff') 

我知道,这行不通,但你有什么想法吗?有没有一种简单的方法来转置查询的结果?就像是:

Select transposed (1, 'foo', 2, 'bar', 3, 'more stuff') from dual 

我想将“开销字符”的数量保持在最低水平。

4

2 回答 2

10

您可以使用connect by level生成更多记录 - 例如:

select level, decode(level, 1,'foo', 2,'bar', 3,'more stuff')
from dual connect by level <= 3
于 2012-02-27T12:28:05.827 回答
2

如果有多个列 - 那么这也适用 -

select
  REGEXP_SUBSTR (jango,'^[^#]*') as f1,
  REGEXP_SUBSTR(REGEXP_REPLACE(jango,'^([^#]*#){1}', ''),'^[^#]*') as f2,
  REGEXP_REPLACE(jango,'^([^#]*#){2}', '') as f3
from
  (
  Select decode(level,
    1, 'foo#koo#joo',
    2, 'bar#loo#too' ,
    3, 'more stuff#doo#dingo') as jango
  from dual connect by level <= 20
  )

这是它的工作原理 - 内部查询与上面相同,我使用 # 附加了多个列 - 需要注意它不是正则表达式系列的一部分,否则我们需要转义它。

  Select decode(level,
    1, 'foo#koo#joo',
    2, 'bar#loo#too' ,
    3, 'more stuff#doo#dingo') as jango
  from dual connect by level <= 20

给出以下 -

             Jango
-------------------
foo#koo#joo
bar#loo#too
more stuff#doo#dingo

现在从输出列中选择以下部分 - 'jango',直到 #

  REGEXP_SUBSTR (jango,'^[^#]*') as f1,

  O/p --> foo

对于第二列,我们删除第一列的内容,然后是 #

  REGEXP_REPLACE(jango,'^([^#]*#){1}', '')

  we get --> koo#joo

现在第一步 - 获得第一个字段。

对于更多字段 {1} 可以增加。

于 2013-09-26T05:48:04.850 回答