#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;