用 T-SQL 创建一个可视的骰子滚轮(只是为了好玩)

Posted

技术标签:

【中文标题】用 T-SQL 创建一个可视的骰子滚轮(只是为了好玩)【英文标题】:Creating a visual dice roller with T-SQL (just for fun) 【发布时间】:2019-09-03 05:58:47 【问题描述】:

只是为了好玩,我想使用 SQL 创建一个可视的骰子滚轮(我知道这几乎不是该语言的设计目的)。

我想出了下面的代码,它会滚动任意数量的骰子 (@Dice) 并显示每个骰子的可视化表示,就像普通的六面骰子一样。

CREATE TABLE #Row1 ([1] CHAR(1), [2] CHAR(1), [3] CHAR(1))
CREATE TABLE #Row2 ([1] CHAR(1), [2] CHAR(1), [3] CHAR(1))
CREATE TABLE #Row3 ([1] CHAR(1), [2] CHAR(1), [3] CHAR(1))

DECLARE @Number INT
DECLARE @Count INT = 1
DECLARE @Dice INT = 2

WHILE @Count <= @Dice
BEGIN
SET @Number = ROUND(RAND(CONVERT(VARBINARY,NEWID()))*6,0,1)+1

INSERT INTO #Row1 ([1], [2], [3]) VALUES (
 CASE WHEN @Number < 4 THEN ''
                       ELSE '•'
                       END
,''
,CASE WHEN @Number = 1 THEN ''
                       ELSE '•'
                       END
)

INSERT INTO #Row2 ([1], [2], [3]) VALUES (
 CASE WHEN @Number <> 6 THEN ''
                        ELSE '•'
                        END
,CASE WHEN @Number % 2 = 0 THEN ''
                           ELSE '•'
                           END
,CASE WHEN @Number <> 6 THEN ''
                        ELSE '•'
                        END
)

INSERT INTO #Row3 ([1], [2], [3]) VALUES (
 CASE WHEN @Number = 1 THEN ''
                       ELSE '•'
                       END
,''
,CASE WHEN @Number < 4 THEN ''
                       ELSE '•'
                       END
)

SELECT * FROM #Row1
UNION ALL
SELECT * FROM #Row2
UNION ALL
SELECT * FROM #Row3

TRUNCATE TABLE #Row1
TRUNCATE TABLE #Row2
TRUNCATE TABLE #Row3

SET @Count += 1
END

DROP TABLE #Row1
DROP TABLE #Row2
DROP TABLE #Row3

我的问题是,如何提高效率?没有这么多UNIONs,有没有办法做到这一点?

我也有兴趣看到人们可能有任何想法来扩展此/使其更有趣!

【问题讨论】:

抱歉,在这个类别中,我认为没有比drawing Mandelbrot sets in T-SQL 更有趣的了。这并不是说你不应该尝试...... 【参考方案1】:

使用表变量而不是临时表。并将所有三行包含在同一个表变量中:

DECLARE @Rows TABLE ([Row] INT, [1] NCHAR(1), [2] NCHAR(1), [3] NCHAR(1));
DECLARE @Number INT;
DECLARE @Count INT = 1;
DECLARE @Dice INT = 2;

WHILE @Count <= @Dice
BEGIN
SET @Number = ROUND(RAND(CONVERT(VARBINARY,NEWID()))*6,0,1)+1;

INSERT INTO @Rows ([Row], [1], [2], [3]) VALUES
(
     1
    ,CASE WHEN @Number < 4 THEN N'' ELSE N'•' END
    ,N''
    ,CASE WHEN @Number = 1 THEN N'' ELSE N'•' END
),
(
     2
    ,CASE WHEN @Number <> 6 THEN N'' ELSE N'•' END
    ,CASE WHEN @Number % 2 = 0 THEN N'' ELSE N'•' END
    ,CASE WHEN @Number <> 6 THEN N'' ELSE N'•' END
),
(
     3
    ,CASE WHEN @Number = 1 THEN N'' ELSE N'•' END
    ,N''
    ,CASE WHEN @Number < 4 THEN N'' ELSE N'•' END
);

SELECT [1], [2], [3] FROM @Rows ORDER BY [Row];
DELETE FROM @Rows;

SET @Count += 1;
END;

编辑:

我更新了我的解决方案,将三个记录插入到单个 INSERT 语句中,而不是为每个记录插入三个单独的 INSERT 语句。

【讨论】:

你刚刚打败了我。删除 order by 可能值得,因为这是默认情况下发生的,然后您可以删除 Row 列以匹配 OP 的结果:SELECT [1], [2], [3] FROM @Rows; 啊,太好了,我什至不知道表变量是一个东西......绝对是我会研究更多的东西! @mtr.web :) 感谢您提供有关订购的提示。我认为你可能是非常正确的。但就个人而言,我对 SQL Server 的默认排序有一些不好的体验。所以如果我需要一个功能上必要的排序,我总是明确地设置它。只是为了确定。 ;) 我有过类似的经历,所以我同意。在这种情况下,它是由您输入它们的顺序设置的。所以,据我所知,它应该始终处于正确的顺序(对于这个用例) 一个非常非常小的注释,但我建议使用NCHAR 在数据库排序规则中可表示不是给定的。

以上是关于用 T-SQL 创建一个可视的骰子滚轮(只是为了好玩)的主要内容,如果未能解决你的问题,请参考以下文章

电脑鼠标滚轮不能滑动怎么办 电脑鼠标滚轮不能滑动处理方法

jQuery AJAX setTimeout回调

骰子传奇

《剑指offer》 面试题43 n个骰子的点数 (java)

试图用Python重新创建一个名为“ Going to Boston”的骰子游戏

使用python制作一个抽奖小游戏——骰子游戏