【问题标题】:How to draw a triangle in SQL Server?如何在 SQL Server 中绘制三角形?
【发布时间】:2021-04-17 03:18:57
【问题描述】:

如何在SQL Server中绘制三角形如下图?

我想通过使用WHILE 循环来实现它,但我无法在 SQL Server 的一行中打印 20 个“*”。

我怎样才能做到这一点?

【问题讨论】:

  • 为什么要使用 any 循环? SQL 不需要循环。只要您还没有 Numbers 表,您所需要的只是一种生成从 1 到 20 的序列的方法
  • 您可能正在寻找REPLICATE 函数
  • 您为什么要这样做?对我来说听起来像是某种学校作业..

标签: sql-server


【解决方案1】:

在 WHILE 中使用 REPLICATE。我想,如果你做对了,你可以达到你想要的输出吗?

DECLARE @i INT = 20

WHILE(@i>0)
BEGIN
   PRINT REPLICATE('* ', @i);
   SET @i = @i - 1;
END

【讨论】:

  • 在 SQL 中使用任何类型的循环都是一个坏主意,即使它只是为了解决难题。
  • 虽然这只是一个很好的编程问题。Habiba 脚本很好。而且在现实生活中也存在无法避免循环或光标的情况,那么使用它没有任何害处。
  • @KumarHarsh 在现实生活中,你总是可以避免循环和游标。需要循环的情况极为罕见。在几乎所有情况下,循环都更难、更慢并导致大量阻塞
  • @PanagiotisKanavos 我知道游标 /loop/RBAR 的邪恶。顺便说一句,您在构建过程和 sql server 的功能中看到过。在这样的一些示例中,可以使用循环来增强你的技能。你的脚本也很好
  • @PanagiotisKanavos:抛开实用主义不谈,您能否支持您关于循环“更难、更慢并导致大量阻塞”的断言对于这种情况
【解决方案2】:

您可以使用REPLICATE 将一个字符重复一定次数。要生成从 1 到 20 的数字序列,无论如何您都不需要 WHILE - SQL 并不真的需要 WHILE 语句来处理数据。

数字序列总是有用的,这就是为什么几乎每个 SQL 开发人员都会创建 Numbers table

如果您还没有,生成 20 个数字的一​​种快速而肮脏的方法是从系统表中选择前 20 行,并使用ROW_NUMBER 计算行数,例如:

select top 20 replicate('*',21-row_number() over (order by id) )
from sys.sysobjects

使用 Numbers 表,查询更简单:

select replicate('*',Number )
from dbo.Numbers
where Numbers.Number <= 20
order by Number desc

数字表非常有用,例如对于从 2017/1/1 开始的 200 天这样的元素集:

select dateadd(d,Number,cast('20170101' as date))
from dbo.Numbers
where Numbers.n<= 20
order by Number desc

【讨论】:

    【解决方案3】:

    试试这个,

    DECLARE @StrLen INT = 20
    
    WHILE @StrLen >= 1
    BEGIN
        PRINT REPLICATE('*',@StrLen)
        SET @StrLen = @StrLen - 1
    END
    

    【讨论】:

      【解决方案4】:

      没有 replicate() 解决方案

      BEGIN
      DECLARE @i int = 20
      DECLARE @j int
      DECLARE @line varchar(max)
      
              WHILE @i > 0
      
              BEGIN
                  SET @line = ''
                  SET @j = 0
                      WHILE @j < @i
                      BEGIN
                          SET @line +=  '* '
                          SET @j = @j + 1
                      END
                      PRINT @line
                  SET @i = @i - 1
      
              END
      END
      

      【讨论】:

        【解决方案5】:

        使用递归 CTE(按 Ctrl+T 获取文本结果)

        ;WITH A AS (
                SELECT REPLICATE('* ', 20) X
            UNION ALL
                SELECT LEFT(X, LEN(X) - 2)
                FROM A
                WHERE X > '* '
            )
        SELECT * FROM A
        

        另一种方式:

        ;WITH A AS (
                SELECT 20 X
            UNION ALL
                SELECT X - 1 FROM A
                WHERE X > 1
            )
        SELECT REPLICATE('* ', X) FROM A
        

        【讨论】:

          【解决方案6】:

          试试下面的代码:

          Declare @i int,@a int
          Set @a = 7
          Set @i = -@a;
          While (@i<10)
          Begin
          	Set @i = @i + 1
          	Print replicate('* ',@a - abs(@i))
          End

          你可以看到更多不同的三角形examples in here

          【讨论】:

          • 请说明此代码不是您的,而是取自您所链接的网站。情况并不完全清楚。还要确保原始网站允许您在 Stackoverflow 上使用他们的代码,否则即使您给予信任,这也可能侵犯版权。
          猜你喜欢
          • 1970-01-01
          • 2012-10-17
          • 1970-01-01
          • 2014-12-10
          • 1970-01-01
          • 2020-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多