【问题标题】:How do I print a triangle of stars using SQL如何使用 SQL 打印星形三角形
【发布时间】:2012-03-29 17:27:13
【问题描述】:

实际上是否有可能在 SQL 中创建如下所示的星形三角形。我知道这可以在任何其他编程语言(如 C、C++、Java)中轻松完成,但想知道是否真的有可能SQL 或 PL/SQL。我尝试在 Oracle 中使用双表处理它,但无法通过它。

  *              *
 * *             * * 
* * *    or      * * *

如果有人知道的话,请帮忙解释一下。

【问题讨论】:

  • 是的,应该可以。这只是为了好玩还是真正的目的?
  • SQL 本身不能打印任何东西,可以吗?
  • 三角形的高度是怎么指定的?它应该如何返回,作为行集合或单个字段等?
  • 闻起来像作业!抱歉,如果不是... ;)
  • 我希望它是通用的。如果我想打印它的长度为 'n' 我该怎么做?我应该使用“n”个 SELECTS 并将它们全部合并吗?

标签: sql database oracle


【解决方案1】:

最简单的方法是这样的。如果你想构建等边三角形而不是直角三角形,你可以变得更复杂。

SQL> ed
Wrote file afiedt.buf

  1  select rpad( '* ', level*2, '* ' )
  2    from dual
  3* connect by level <= 3
SQL> /

RPAD('*',LEVEL*2,'*')
--------------------------------------------------------------------------------
*
* *
* * *

【讨论】:

  • 这是我要找的那个...谢谢...但是等边三角形怎么样...?
  • 该查询不需要逐级排序以保证生成三角形吗?
【解决方案2】:
select rpad('* ', level * 2, '* ')
  from dual connect by
    level <= 10
* 
* * 
* * * 
* * * * 
* * * * * 
* * * * * * 
* * * * * * * 
* * * * * * * * 
* * * * * * * * * 
* * * * * * * * * * 


select rpad(' ',r*2,' ')||rpad('* ',l*2,'* ') k 
  from ( select level l,row_number() over(order by null) r 
            from dual 
           connect by level<=10 
         order by l desc)

  * * * * * * * * * * 
    * * * * * * * * * 
      * * * * * * * * 
        * * * * * * * 
          * * * * * * 
            * * * * * 
              * * * * 
                * * * 
                  * * 
                    *



select rpad(' ',l*2,' ')||rpad('* ',r*2,'* ') k 
 from ( select level l,row_number() over(order by null) r 
          from dual 
         connect by level<=10 
         order by l desc)

                    * 
                  * * 
                * * * 
              * * * * 
            * * * * * 
          * * * * * * 
        * * * * * * * 
      * * * * * * * * 
    * * * * * * * * * 
  * * * * * * * * * * 

select rpad(' ',l,' ')||rpad('* ',r*2,'* ') k 
from ( select level l,row_number() over(order by null) r 
        from dual 
       connect by level<=10 
       order by l desc) 

      * 
     * * 
    * * * 
   * * * * 
  * * * * * 
 * * * * * * 
* * * * * * *        

【讨论】:

  • 您可能想要改进源代码的格式。几乎无法阅读!
【解决方案3】:

不确定您到底在寻找什么。也许是这个?

select '*' from dual
union all select '**' from dual
union all select '***' from dual

Example

【讨论】:

  • 不适合如果我必须打印大量时间,例如20.
【解决方案4】:

这是在 sql 中获取完美三角形或金字塔的脚本(在 Microsoft Sql 2008 中测试)

declare @x int,@y int
select @x=5,@y=0
while @x>0
begin
print space(@x)+replicate('*',@y)+replicate('*',@y+1)
set @y=@y+1
set @x=@x-1
end

     *
    ***
   *****
  *******
 *********

您可以通过此链接获得更多脚本和帮助...这对我很有帮助

链接:-sqlquerynscript

【讨论】:

  • 这不是 Oracle 支持的语法。
【解决方案5】:

试试这个..

 declare @x int,@y int,@diff int
 select @x=0,@y=10,@diff=2--diferrence between consecutive rows
 while @x<@y
 begin
    if @x=0 and @diff<>1
       print space((@y-@x)*@diff-1)+replicate('*',1)
    else if(@diff%2=0)
       print space((@y-@x)*@diff)+replicate('* ',@x+(@x*(@diff-1)))
    else
       print space((@y-@x)*@diff)+replicate('* ',@x+(@x*(@diff-1)))
    select @x=@x+1
 end

【讨论】:

    【解决方案6】:

    如果你想要的只是简单的三角形,那么你可以这样做:

    SELECT '*' FROM table
    UNION
    SELECT '**' FROM table
    UNION
    SELECT '***' FROM table
    

    【讨论】:

      【解决方案7】:
      declare @count int,@num int,@num1 int, @space int, @str varchar(50)
      set @count = 5 set @num = 1
      while(@num<=@count)
      begin
        set @num1 = 0 set @space = @count-@num
        while (@num1<@num)
        begin
         if @str is null
          set @str = '* '
         else
          set @str = @str+'* '   set @num1 = @num1+1
        end
      print (space(@space)+@str)
      set @num = @num+1   set @str = null
      end
      

      【讨论】:

        【解决方案8】:

        [Equilateral Traingle]我们可以用Oracle SQL做一个金字塔如下。

        select rpad(' ',5 -level) || rpad( '* ', level*2, '* ' )
           from dual
         connect by level <= 5;
        

        ** 这里 5 是行数。

        让我们反过来,

        select rpad(' ',level) || rpad( '* ', 2*(5-level+1), '* ' )
          from dual
         connect by level <= 5; 
        

        【讨论】:

          【解决方案9】:
          declare @row int = 5,
          @index int = 0,
          @string nvarchar(5) =''
          while @row > 0
          begin
              set @index = @row
              while @index > 0
              begin
                  set @string = '*' + @string
                  set @index = @index - 1
              end
              print @string
              set @string = ''
              set @row = @row - 1
          end
          
           *****
           ****
           ***
           **
           *
          

          【讨论】:

          • 这似乎可行,但要纠正一点语法错误需要付出很多努力。如果明星方向无关紧要,我花了一段时间才发现它有什么问题才能投反对票
          【解决方案10】:
          DECLARE @lclMaxLevel INT=5
          DECLARE @lclPrintCount INT =0
          
          WHILE @lclMaxLevel > 0
            BEGIN
                PRINT Space(@lclMaxLevel)
                      + Replicate('*', @lclPrintCount+1)
          
                SET @lclMaxLevel=@lclMaxLevel - 1
                SET @lclPrintCount=@lclPrintCount + 1
            END
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-08-26
            • 2014-12-08
            • 2016-02-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多