以下是使用递归 CTE 的素数生成器的尝试:
WITH RECURSIVE prime(num, is_prime) AS (
SELECT 1, 1
UNION ALL
SELECT
num+1,
IF( num+1 IN (2,3,5,7) OR (
(num+1)%2!=0 AND
(num+1)%3!=0 AND
(num+1)%4!=0 AND
(num+1)%5!=0 AND
(num+1)%6!=0 AND
(num+1)%7!=0 AND
(num+1)%8!=0 AND
(num+1)%9!=0 AND
(num+1)%10!=0),
num+1, NULL
)
FROM prime WHERE num < 100
) SELECT * FROM prime;
┌─────┬──────────┐
│ num ┆ is_prime │
╞═════╪══════════╡
│ 1 ┆ 1 │
│ 2 ┆ 2 │
│ 3 ┆ 3 │
│ 4 ┆ │
│ 5 ┆ 5 │
│ 6 ┆ │
│ 7 ┆ 7 │
│ 8 ┆ │
...etc...
我知道这包括可以优化的项目(例如
MOD 9
或 MOD 10
),但我将它们留在那里以使事情更加明确。有没有另一种方法可以做到这一点,而不必单独写出每个案例?例如,拥有类似 RANGE(10)
的东西并基于它进行迭代(无需编写程序代码/扩展)。
什么可能是一种创造性的方法来做到这一点,甚至可能使用另一种递归 CTE?
不确定你需要达到多高,但我测试了上限为 10,000,返回了 1229 个素数结果。
WITH Numbers AS (
SELECT 2 AS Number
UNION ALL
SELECT Number + 1
FROM Numbers
WHERE Number < 10000) -- Highest prime number to include
,Primes AS (
SELECT Number
FROM Numbers
WHERE NOT EXISTS (
SELECT 1
FROM Numbers n
WHERE n.Number < Numbers.Number
AND Numbers.Number % n.Number = 0))
SELECT TOP 2000 Number -- Max number of results to return
FROM Primes
OPTION (MAXRECURSION 0)