代码之家  ›  专栏  ›  技术社区  ›  Igor Konoplyanko

如何从(‘1’、‘2’、‘3’)生成结果集?

  •  1
  • Igor Konoplyanko  · 技术社区  · 15 年前

    我有一个问题,我如何才能使结果集只列出值。例如,我有这样的值: ('1','2','3') 我想创建一个返回此类表的SQL:

    1
    2
    3
    

    谢谢。

    [编辑]

    抱歉问错了。 实际上,列表不包含整数,但它包含字符串。 我现在需要像(‘aa’、‘bb’、‘cc’)。

    [/编辑]

    4 回复  |  直到 15 年前
        1
  •  1
  •   David    15 年前

    我找到的最佳方法是使用XML。

    
    SELECT items.extract('/l/text()').getStringVal() item
    FROM TABLE(xmlSequence(
            EXTRACT(XMLType(''||
            REPLACE('aa,bb,cc',',','')||'')
              ,'/all/l'))) items;
    

    希望我能获得荣誉,但遗憾的是: http://pbarut.blogspot.com/2006/10/binding-list-variable.html .

    基本上,它所做的就是将列表转换为一个XML文档,然后重新解析它。

        2
  •  3
  •   Richard Nichols    15 年前

    如果要编写一个SQL语句,该语句将采用逗号分隔的列表并生成任意数量的实际行,唯一的实际方法是使用表函数,该函数调用一个pl/sql函数,该函数将输入字符串拆分,并将元素作为单独的行返回。

    Check out this link 对于表函数的介绍。

    或者,如果可以在客户机中以编程方式构造SQL语句,则可以执行以下操作:

    SELECT 'aa' FROM DUAL
    UNION
    SELECT 'bb' FROM DUAL
    UNION
    SELECT 'cc' FROM DUAL
    
        3
  •  1
  •   Thilo    15 年前

    最简单的方法是滥用保证有足够行的表。

    -- for Oracle
    select rownum from tab where rownum < 4;
    

    如果不可能,请查看 Oracle Row Generator Techniques .

    我喜欢这个(需要10克):

    select integer_value
    from   dual
    where  1=2
    model
      dimension by ( 0 as key )
      measures     ( 0 as integer_value )
      rules upsert ( integer_value[ for key from 1 to 10 increment 1 ] = cv(key) )
    ;
    
        4
  •  1
  •   anon    15 年前

    我在各种数据库系统(不仅仅是SQL数据库)中使用的一个技巧实际上是拥有一个只包含前100或1000个整数的表。这样的表很容易通过编程创建,然后您的查询将变为:

    SELECT value FROM numbers WHERE value < 4 ORDER BY value
    

    您可以将该表用于许多类似的用途。