sql >> Database >  >> RDS >> Sqlserver

SQL Priemgetal-functie

Je zou, zoals je zei, een tabel kunnen hebben die alle priemgetallen tot 10 miljoen opslaat . Dan zou het triviaal zijn om op te zoeken of een getal een priemgetal was of niet. De vraag is dan welke methode sneller zou zijn. Ik vermoed dat de tafel veel sneller zou zijn (ik heb deze bewering niet getest).

Primaire tafeloplossing

SQL-functie-oplossingen

Oplossing 0

Hier is een oplossing via Priemgetallen vinden met een Transact-SQL-functie :

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
–- =============================================
–- Author:        Nicolas Verhaeghe
–- Create date: 12/14/2008
–- Description:   Determines if a given integer is a prime
/*

      SELECT dbo.IsPrime(1)

      SELECT dbo.IsPrime(9)

      SELECT dbo.IsPrime(7867)

*/
–- =============================================
CREATE FUNCTION [dbo].[isPrime]
(
      @NumberToTest int
)
RETURNS bit
AS
BEGIN
      -– Declare the return variable here
      DECLARE @IsPrime bit,
                  @Divider int

      –- To speed things up, we will only attempt dividing by odd numbers

      –- We first take care of all evens, except 2
      IF (@NumberToTest % 2 = 0 AND @NumberToTest > 2)
            SET @IsPrime = 0
      ELSE
            SET @IsPrime = 1 –- By default, declare the number a prime

      –- We then use a loop to attempt to disprove the number is a prime

      SET @Divider = 3 -– Start with the first odd superior to 1

      –- We loop up through the odds until the square root of the number to test
      –- or until we disprove the number is a prime
      WHILE (@Divider <= floor(sqrt(@NumberToTest))) AND (@IsPrime = 1)
      BEGIN

            –- Simply use a modulo
            IF @NumberToTest % @Divider = 0
                  SET @IsPrime = 0
            –- We only consider odds, therefore the step is 2
            SET @Divider = @Divider + 2
      END  

      –- Return the result of the function
      RETURN @IsPrime

END
Oplossing 1

Hier is nog een oplossing via hoe kom je erachter of het een priemgetal of een niet-priemgetal is met één select-statement? Er staat ook meer informatie in andere opmerkingen.

CREATE FUNCTION isPrime
(
    @number INT
)
RETURNS VARCHAR(10)
BEGIN
    DECLARE @prime_or_notPrime INT
    DECLARE @counter INT
    DECLARE @retVal VARCHAR(10)
    SET @retVal = 'FALSE'

    SET @prime_or_notPrime = 1
    SET @counter = 2

    WHILE (@counter <= @number/2 )
    BEGIN

        IF (( @number % @counter) = 0 )
        BEGIN
            set @prime_or_notPrime = 0
            BREAK
        END

        IF (@prime_or_notPrime = 1 )
        BEGIN
            SET @retVal = 'TRUE'
        END

        SET @counter = @counter + 1
    END
    return @retVal
END


  1. Gegevens uit de kolom van een tabel invoegen en in een andere tabel opslaan

  2. Hoe IDENTITY_INSERT in- en uitschakelen met SQL Server 2008?

  3. selecteer alle rijen behalve de vier meest recente

  4. SpringDataJPA save OneToOne-relatie ophalen Kan geen onderliggende rij toevoegen of bijwerken:een externe-sleutelbeperking mislukt