#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