如何使用 SQL 打印星形三角形
Posted
技术标签:
【中文标题】如何使用 SQL 打印星形三角形【英文标题】:How do I print a triangle of stars using SQL 【发布时间】:2012-03-29 17:27:13 【问题描述】:实际上是否有可能在 SQL 中创建如下所示的星形三角形。我知道这可以在任何其他编程语言(如 C、C++、Java)中轻松完成,但想知道是否真的有可能SQL 或 PL/SQL。我尝试在 Oracle 中使用双表处理它,但无法通过它。
* *
* * * *
* * * or * * *
如果有人知道的话,请帮忙解释一下。
【问题讨论】:
是的,应该可以。这只是为了好玩还是真正的目的? SQL 本身不能打印任何东西,可以吗? 三角形的高度是怎么指定的?它应该如何返回,作为行集合或单个字段等? 闻起来像作业!抱歉,如果不是... ;) 我希望它是通用的。如果我想打印它的长度为 'n' 我该怎么做?我应该使用“n”个 SELECTS 并将它们全部合并吗? 【参考方案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
【讨论】:
以上是关于如何使用 SQL 打印星形三角形的主要内容,如果未能解决你的问题,请参考以下文章