Хранимая процедура SQL Server: нахождение значений четности и нечетности

#sql #sql-server #stored-procedures #sql-server-2014

#sql #sql-сервер #хранимые процедуры #sql-server-2014

Вопрос:

Я использую @subno в качестве входных данных. И мне пришлось находить четные и нечетные числа. 16 не является исправлением, и это может быть любое другое число. Мой вопрос в том, как найти нечетное и четное число моих входных данных?

Наконец, subno включает точку ( . ) в любой позиции. например, 123456.789123 Мне нужно найти четное и нечетное число «123456» и четное и нечетное число «789123» точка ( . ) является разделителем.

Как только вы найдете нечетное значение для левой части, суммируйте их вместе. Как только вы найдете четное число для левой части, также суммируйте его, а затем добавьте общее нечетное значение к общему четному значению. То же самое относится и к правой стороне, например, «789123».

Пожалуйста, помогите мне. это моя вторая неделя попыток найти решение. Как только вы найдете все итоговые значения для каждой стороны, умножьте их вместе. пример «123456» — общее значение четности и нечетности * общее значение четности и нечетности «789123».

Это для проверки контрольной цифры. Проверка номера абонента. после проверки посредством вычисления вычисленный ссылочный номер должен соответствовать действительному контрольному разрядному номеру. Это бизнес-правило. Вид алгоритма

 create procedure ProcedureName
    (@subno VARCHAR(16),   --Input the 16 subscriber number
     @result INT OUT,
    )
as
begin
    IF(LEN(@subno) <> 16)
        SET @result = 1 -- INVALID RESULT
    ELSE
       IF(@subno % 2 = 0)
           SET @result = @subno - even numbers
       ELSE
           SET @result = @subno --odd numbers
end
  

Пожалуйста, смотрите ниже мой пример работы

 -- this is the sample

create procedure   ProcedureName
(
@subno VARCHAR(20),   --Subscriber no
@result INT OUT,      --result is invalid for 1, valid for 0
@payamt int
)
as

DECLARE @WA VARCHAR(2)
DECLARE @Weights varchar(9)
DECLARE @I INT
DECLARE @WD INT
DECLARE @WP INT
DECLARE @A INT
DECLARE @B INT
DECLARE @R INT
DECLARE @WR INT

SET @WR = 0
SET @R = 0
SET @A = 0
SET @B = 0
SET @WP = 0
SET @I = 0

BEGIN

IF (LEN(@subNo) = 7) AND (SUBSTRING(@subno,1,1) = '2') OR (SUBSTRING(@subno,1,1) = '9')
    BEGIN
        SET @result = 0 --VALID
    END
ELSE IF(LEN(@subno) = 8) AND (SUBSTRING(@subno,1,1) = '2') OR 
(SUBSTRING(@subno,1,1) = '9')
    BEGIN
        SET @result = 0 --VALID
    END
ELSE IF(LEN(@subno) = 9)
BEGIN
    SET @WA = SUBSTRING(@subno,1,2)
        IF(@WA = '65')
            set @result = 1 -- INVALID
        else
        BEGIN
        SET @Weights = '12121212'
        SET @WA = SUBSTRING(@subno,9,1)
        SET @WD = 0
        SET @I = 1
        WHILE @I<9
        BEGIN
            SET @WP = cast(SUBSTRING(@Weights, @I,1)as int) * cast(SUBSTRING(@subno, @I, 1) as int)
            IF(@WP > 9)
            BEGIN
                SET @A = SUBSTRING(CAST(@WP AS VARCHAR),1,1)
                SET @B = SUBSTRING(CAST(@WP AS VARCHAR),2,1)
                SET @WP = CAST(@A AS INT)   CAST(@B AS INT)
            END

            SET @WD = @WP   @WD
            SET @I = @I   1
        END

        SET @R = @WD % 10

        IF(@R <> 0)
            SET @WR = 10 - @R
        ELSE
            SET @WR = @R

        IF(@WR <> CAST(@WA AS INT))
        BEGIN
            SET @result = 1 -- INVALID
        END
        ELSE
        BEGIN
            SET @result = 0 -- VALID
        END
    END
END
ELSE IF (LEN(@subno) = 10)
BEGIN
    SET @I =1
    SET @WD = 0
    SET @Weights = '121212121'
    SET @WA = SUBSTRING(@subno,10,1)
    WHILE(@I < 10)
    BEGIN
        SET @WP = CAST(SUBSTRING(@Weights, @I, 1)AS INT) * CAST(SUBSTRING(@subno, @I, 1) AS INT)
        IF(@WP > 9)
        BEGIN
            SET @A = SUBSTRING(CAST(@WP AS VARCHAR),1,1)
            SET @B = SUBSTRING(CAST(@WP AS VARCHAR),2,1)
            SET @WP = CAST(@A AS INT)   CAST(@B AS INT)
        END

        SET @WD = @WP   @WD
        SET @I = @I   1
    END

    SET @R = @WD % 10

    IF(@R <> 0)
        SET @WR = 10 - @R
    ELSE
        SET @WR = @R

    IF (@WR<> @WA)
    BEGIN
        SET @result = 1 -- INVALID
    END
    ELSE
    BEGIN
        SET @result = 0 -- VALID
    END
END
ELSE
    SET @result = 1 -- INVALID
END
  

Комментарии:

1. Пожалуйста, отредактируйте свой вопрос и покажите, как бы вы вызывали процедуру и ожидаемый результат.

2. Привет, сэр, редактирование завершено.

3. Это просто не имеет смысла: ‘Мне нужно найти четное и нечетное число «123456» и четное и нечетное число «789123» .’

4. Каков ваш ожидаемый результат? Формулировка вашего вопроса делает неясным, чего вы хотите.

5. «Как только вы найдете нечетное значение для левой части, суммируйте их вместе. Как только вы найдете четное число для левой части, также суммируйте его, а затем добавьте общее нечетное значение к общему четному значению.» — Это утверждение эквивалентно предложению сложить все цифры вместе. Какое значение имеют четность и нечетность в этом вопросе?

Ответ №1:

Разделите полученные значения. Затем выполните итерацию с каждой стороны и добавьте их. Пожалуйста, посмотрите пример ниже.

 declare @v varchar (16) , @num1 varchar(20) , @num2 varchar(20)
set @v = '1234567.78906656'

select  @num1 = substring(@v,0,charindex('.',@v))

select @num2 = substring(@v,charindex('.',@v) 1,len(@v))
--select @num1 = convert(int, substring(@v,0,charindex('.',@v)))
--select @num2 =  substring(@v,charindex('.',@v) 1,len(@v))
declare @index int = 1 ,@len INT , @char CHAR
declare @TotalOddL int  = 0
declare @TotalEvenL int  = 0
DECLARE @FullTotL INT = 0
declare @TotalOddR int  = 0
declare @TotalEvenR int  = 0
DECLARE @FullTotR INT = 0
DECLARE @TEMP INT
set @len= LEN(@num1)



WHILE @index <= @len
BEGIN
set @char = SUBSTRING(@num1, @index, 1)
SET @TEMP = cast(@char as int)
IF(@TEMP % 2 = 0)
   SET  @TotalEvenL = @TotalEvenL   @char
     else
   SET  @TotalOddL = @TotalOddL   @char

   SET @FullTotL = @TotalEvenL   @TotalOddL 


SET @index= @index  1
END

Select 'LeftSide total' , @FullTotL
Select 'Left Side odd' , @TotalOddL
Select 'Left Side Even' , @TotalEvenL

SET @index = 1
set @len= LEN(@num2)
WHILE @index <= @len
BEGIN
set @char = SUBSTRING(@num2, @index, 1)
SET @TEMP = cast(@char as int)
IF(@TEMP % 2 = 0)
   SET  @TotalEvenR= @TotalEvenR   @char
     else
   SET  @TotalOddR = @TotalOddR   @char

   SET @FullTotR = @TotalEvenR   @TotalOddR 

SET @index= @index  1
END


select 'TotalRSide' , @FullTotR
select 'RsideOdd' , @TotalOddR
select 'RSideEven' , @TotalEvenR

select 'Multiplied value' , @FullTotR * @FullTotL
  

Комментарии:

1. Этот код делает то же самое, т. е. нет отношения к четности и нечетности: объявите @v varchar(16) = ‘1234567.78906656’; Выберите ‘Общее количество слева’, len(подстрока(@v,0,charindex(‘.’,@v))) выберите ‘Общее количество слева’, len(подстрока(@v,charindex(‘.’,@v) 1,len(@v))) выберите ‘Умноженное значение’ , len(подстрока(@v,0,charindex(‘.’,@v))) * len(подстрока(@v,charindex(‘.’,@v) 1,len(@v)))

2. @FakeisMe Я все еще пытаюсь обработать это в своем коде прямо сейчас. Свяжусь с вами, как только закончу. Спасибо.

3. это не сработало. вычисляется только количество нечетных и четных цифр, а не значение входных данных.

4. значение какого ввода? ввод sp или каждого символа?

Ответ №2:

 create or replace procedure prc_even_odd(i_number in number, o_result out varchar2)
as
begin
    if (mod(i_number,2) = 0) then
        o_result := 'EVEN';
    else
        o_result := 'ODD';
end prc_even;