2014-10-14 10 views
2

Я использую SqlServe, и мне нужно получить все строки, где часть строки находится в пределах определенного числа.Номер части строки в определенном диапазоне

В качестве примера я попал в колонку uniqueStringID:

  • BE09 MyTest
  • Ве10 MyTest
  • CE101 MyTest
  • CE300 MyTest

и я хочу, чтобы все строки, в которых число внутри uniqueStringID (число должно быть расположено перед пространством) находится между (включая) 10 и 101

Так результат будет:

  • Ве10 MyTest
  • CE101 MyTest

Мой вопрос здесь это возможно только с SQL или мне нужна хранимая процедура для этого? И если прежний, как бы SQL был?

ответ

1
drop table #t 
create table #t(id varchar(100)) 
insert into #t values('BE09 Mytest'), 
('BE10 Mytest'), 
('CE101 Mytest'), 
('CE300 Mytest'), 
('CE450595 Mytest') 


select id,cast(substring(id,patindex('%[0-9]%',id),patindex('%[a-z0-9] [a-z]%',id)-1) as int) from #t where cast(substring(id,patindex('%[0-9]%',id),patindex('%[a-z0-9] [a-z]%',id)-1) as int) between 10 and 101 

FIDDLE DEMO

FIDDLE DEMO WITH FEW MORE TEST CASES

+0

попробовать отредактирован один @Thomas –

+0

работает отлично TNX. – Thomas

0

Привет первая Создать функцию в SQL сервере

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 

, а затем использовать ниже запроса, чтобы получить результат

SELECT * FROM 
(
SELECT uniqueStringID,dbo.udf_GetNumeric(uniqueStringID) AS NumuniqueStringID 
FROM YourTableName 
) a 
WHERE NumuniqueStringID >=10 and NumuniqueStringID<=101 
0

Вы можете использовать substring, чтобы получить часть с номером для фильтрации (во всех ваших примерах строки в конце концов всегда одинаковой длины):

select cast(substring(uniqueStringID, 3, len(uniqueStringID)-9) as int)