Запрос на получение только чисел из строки
Предположим, у меня есть такие данные:
string 1: 003Preliminary Examination Plan
string 2: Coordination005
string 3: Balance1000sheet
Ожидаемый результат
string 1: 003
string 2: 005
string 3: 1000
И я хочу реализовать его в sql.
Пожалуйста помоги.
Спасибо заранее:)
Ответы
Ответ 1
Сначала создайте этот UDF
CREATE FUNCTION dbo.udf_GetNumeric
(@strAlphaNumeric VARCHAR(256))
RETURNS VARCHAR(256)
AS
BEGIN
DECLARE @intAlpha INT
SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric)
BEGIN
WHILE @intAlpha > 0
BEGIN
SET @strAlphaNumeric = STUFF(@strAlphaNumeric, @intAlpha, 1, '' )
SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric )
END
END
RETURN ISNULL(@strAlphaNumeric,0)
END
GO
Теперь используйте function
как
SELECT dbo.udf_GetNumeric(column_name)
from table_name
SQL FIDDLE
Я надеюсь, что это решило вашу проблему.
Ссылка
Ответ 2
Попробуйте этот вариант -
Query:
DECLARE @temp TABLE
(
string NVARCHAR(50)
)
INSERT INTO @temp (string)
VALUES
('003Preliminary Examination Plan'),
('Coordination005'),
('Balance1000sheet')
SELECT LEFT(subsrt, PATINDEX('%[^0-9]%', subsrt + 't') - 1)
FROM (
SELECT subsrt = SUBSTRING(string, pos, LEN(string))
FROM (
SELECT string, pos = PATINDEX('%[0-9]%', string)
FROM @temp
) d
) t
Вывод:
----------
003
005
1000
Ответ 3
Query:
DECLARE @temp TABLE
(
string NVARCHAR(50)
)
INSERT INTO @temp (string)
VALUES
('003Preliminary Examination Plan'),
('Coordination005'),
('Balance1000sheet')
SELECT SUBSTRING(string, PATINDEX('%[0-9]%', string), PATINDEX('%[0-9][^0-9]%', string + 't') - PATINDEX('%[0-9]%',
string) + 1) AS Number
FROM @temp
Ответ 4
Попробуйте:
declare @var nvarchar(max)='Balance1000sheet'
SELECT LEFT(Val,PATINDEX('%[^0-9]%', Val+'a')-1) from(
SELECT SUBSTRING(@var, PATINDEX('%[0-9]%', @var), LEN(@var)) Val
)x
Ответ 5
С предыдущими запросами я получаю следующие результаты:
'AAAA1234BBBB3333' → → Выход: 1234
'- çã + 0!\aº1234' → → Выход: 0
Код ниже возвращает все числовые символы:
1-й выход: 12343333
2-й вывод: 01234
declare @StringAlphaNum varchar(255)
declare @Character varchar
declare @SizeStringAlfaNumerica int
declare @CountCharacter int
set @StringAlphaNum = 'AAAA1234BBBB3333'
set @SizeStringAlfaNumerica = len(@StringAlphaNum)
set @CountCharacter = 1
while isnumeric(@StringAlphaNum) = 0
begin
while @CountCharacter < @SizeStringAlfaNumerica
begin
if substring(@StringAlphaNum,@CountCharacter,1) not like '[0-9]%'
begin
set @Character = substring(@StringAlphaNum,@CountCharacter,1)
set @StringAlphaNum = replace(@StringAlphaNum, @Character, '')
end
set @CountCharacter = @CountCharacter + 1
end
set @CountCharacter = 0
end
select @StringAlphaNum
Ответ 6
declare @puvodni nvarchar(20)
set @puvodni = N'abc1d8e8ttr987avc'
WHILE PATINDEX('%[^0-9]%', @puvodni) > 0 SET @puvodni = REPLACE(@puvodni, SUBSTRING(@puvodni, PATINDEX('%[^0-9]%', @puvodni), 1), '' )
SELECT @puvodni
Ответ 7
У меня не было прав на создание функций, но был текст, как
["blahblah012345679"]
И нужно было извлечь цифры из середины
Обратите внимание, что предполагается, что числа сгруппированы, а не в начале и в конце строки.
select substring(column_name,patindex('%[0-9]%', column_name),patindex('%[0-9][^0-9]%', column_name)-patindex('%[0-9]%', column_name)+1)
from table name
Ответ 8
Хотя это старая ветка, первая в поиске в Google, я нашел другой ответ, чем тот, что был раньше. Это позволит вам передать свои критерии для того, чтобы уложиться в строку, какими бы ни были эти критерии. Вы можете поместить его в функцию, чтобы вызывать снова и снова, если хотите.
declare @String VARCHAR(MAX) = '-123. a 456-78(90)'
declare @MatchExpression VARCHAR(255) = '%[0-9]%'
declare @return varchar(max)
WHILE PatIndex(@MatchExpression, @String) > 0
begin
set @return = CONCAT(@return, SUBSTRING(@string,patindex(@matchexpression, @string),1))
SET @String = Stuff(@String, PatIndex(@MatchExpression, @String), 1, '')
end
select (@return)
Ответ 9
В Oracle
Вы можете получить то, что хотите, используя это:
SUBSTR('ABCD1234EFGH',REGEXP_INSTR ('ABCD1234EFGH', '[[:digit:]]'),REGEXP_COUNT ('ABCD1234EFGH', '[[:digit:]]'))
Пример запроса:
SELECT SUBSTR('003Preliminary Examination Plan ',REGEXP_INSTR ('003Preliminary Examination Plan ', '[[:digit:]]'),REGEXP_COUNT ('003Preliminary Examination Plan ', '[[:digit:]]')) SAMPLE1,
SUBSTR('Coordination005',REGEXP_INSTR ('Coordination005', '[[:digit:]]'),REGEXP_COUNT ('Coordination005', '[[:digit:]]')) SAMPLE2,
SUBSTR('Balance1000sheet',REGEXP_INSTR ('Balance1000sheet', '[[:digit:]]'),REGEXP_COUNT ('Balance1000sheet', '[[:digit:]]')) SAMPLE3 FROM DUAL
Ответ 10
ВЫБЕРИТЕ regexp_replace (имя-столбца, '[^ 0-9] *', '', 'g');
Ответ 11
Небольшая модификация ответа @Epsicron
SELECT SUBSTRING(string, PATINDEX('%[0-9]%', string), PATINDEX('%[0-9][^0-9]%', string + 't') - PATINDEX('%[0-9]%',
string) + 1) AS Number
FROM (values ('003Preliminary Examination Plan'),
('Coordination005'),
('Balance1000sheet')) as a(string)
нет необходимости во временной переменной
Ответ 12
Если вы используете Postgres и у вас есть данные типа "2000 - некоторый образец текста", попробуйте комбинацию подстроки и позиции, в противном случае, если в вашем сценарии нет разделителя, вам нужно написать регулярное выражение:
SUBSTRING(Column_name from 0 for POSITION('-' in column_name) - 1) as
number_column_name
Ответ 13
В запросах вы можете заменить любой символ, который не является числом, и ничего:
REPLACE( ISNULL( column_name, '' ), '[^0-9]', '' )