Хранимая процедура для ВЫБОРА последних 6 цифр номера

#sql #sql-server #stored-procedures

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

Вопрос:

У меня есть поле данных в таблице SQL с большим числом (9 цифр, номер информации о клиенте). Я хочу запустить хранимую процедуру, которая выберет только последние 6 цифр номера.

Что-то вроде:

 SELECT (Last 6 Digits of num) FROM db
WHERE user = @user
  

Кто-нибудь знает способ добиться этого?

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

1. Используйте RIGHT() функцию, она принимает переменную и количество цифр, которое вы хотите. В вашем случае RIGHT(myField, 6) . Смотрите мой ответ

2. Какую СУБД вы используете? Похоже, вероятно, на MS SQL Server, но вам, вероятно, следует пометить вопрос, чтобы люди знали, если вы не ищете строго ANSI SQL-ответ.

3. Ах Да, я использую MS SQL Server. Мой плохой

4. Я отредактировал ваш пост, чтобы включить sql-server тег

5. Вместо разделения на лету, рассмотрите возможность сохранения подэлементов значения в отдельных столбцах, а затем объединения их с помощью VIEW вычисляемого столбца и т.д.

Ответ №1:

 DECLARE @bigOne bigint

SET @bigOne = 999333444

SELECT RIGHT(@bigOne, 6)
  

Возвращает правую часть символьной строки с указанным количеством символов.
Вот также MSDN для Right() функции:
http://msdn.microsoft.com/en-us/library/ms177532.aspx

В вашем случае, кори, вы можете сделать:

SELECT RIGHT(num, 6) FROM db WHERE user=@user

Просто замените num на имя вашего столбца из таблицы вашей базы данных и измените db на имя вашей таблицы, из которой вы SELECT вводите данные.

Ответ №2:

Вы можете использовать оператор modulo, чтобы легко извлечь последние 6 цифр, предполагая, что num это числовой тип данных:

 select num % 1000000 as num
from db
where user = ?
  

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

1. Это быстрее, чем преобразование строки, когда вы работаете с числовым типом данных.

2. Единственная деталь заключается в том, что это подавит начальные нули в этих цифрах, и строковые ответы оставят их.

Ответ №3:

Предполагая, что SQL Server,

 SELECT subtring(num,len(num)-6,6) FROM db
WHERE user = @user
  

Другие варианты могут использовать substr вместо substring .

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

1. Зачем вы делаете дополнительные вызовы Len() etc, просто используйте Right() и извлеките правильные 6 цифр.

2. О, вау, я никогда не знал, что у SQL Server есть right … Тем не менее, мой ответ работает нормально 🙂

Ответ №4:

Преобразуйте его в строку, затем используйте SUBSTRING и LEN, чтобы извлечь только ту часть, которая вам нужна.

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

1. Это кажется довольно дорогим, приведение, длина и подстрока для получения последних 6 цифр числа?

Ответ №5:

Это позволит точно получить последние 6 цифр из передаваемого вами аргумента.

Следует отметить одну вещь. В SQL Server 2005 символ «» (обратная косая черта) не возвращает 1 с помощью ISNUMERIC. Но это происходит в SQL Server 2008. Эта функция должна работать в обеих версиях SQL Server, поскольку мы просто исключаем этот символ в 7-й части моего тестового аргумента выше.

НАПЕЧАТАТЬ ПРАВИЛЬНО (dbo.fnNumericDigits(‘5-555-555551-2345-6-‘), 6)

Скалярнозначная функция:

 ALTER FUNCTION [dbo].[fnNumericDigits]
(
    @startString NVARCHAR(255)
) RETURNS NVARCHAR(255)
AS
BEGIN

    DECLARE @returnString NVARCHAR(255)
    DECLARE @length INT, @currentDigit INT, @currentCharacter NVARCHAR(1)
    SELECT @length = LEN(@startString), @currentDigit = 1, @returnString = ''

    WHILE @currentDigit <= @length
    BEGIN

    SELECT @currentCharacter = SUBSTRING(@startString, @currentDigit, @currentDigit)

    IF ISNUMERIC(@currentCharacter) = 1 
        AND @currentCharacter != '$'
        AND @currentCharacter != ' '
        AND @currentCharacter != ','
        AND @currentCharacter != '-'
        AND @currentCharacter != '.'
        AND @currentCharacter != ''
    BEGIN
    SELECT @returnString = @returnString   @currentCharacter
    END

    SELECT @currentDigit = @currentDigit   1

END

RETURN @returnString
END