Выберите данные в диапазоне строк - PullRequest
2 голосов
/ 09 июля 2019

У меня есть таблица Employee,

_________________________________
Id | name    |      salary                    
______________________________
1  | John    |   [1300 - 2000] 
_______________________________
2  | Aby     |   [600 - 1000] 
________________________________
3  | Mike    |   [1000 - 1500] 

Столбец зарплаты равен Nvarchar

Я хочу запрос / функцию / SP в SQL, если я ищу 1400, выводдолжно быть как показано ниже

Id | name    |      salary                    
________________________________
1  | John    |   [1300 - 2000] 
_______________________________
3  | Mike    |   [1000 - 1500] 

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 09 июля 2019

объявления @ var1 int = 1400

выберите * из (выберите *, замените (SUBSTRING (зарплата, 0, CHARINDEX ('-', зарплата, 0)), '[', '') как Splitted1, заменить (SUBSTRING (зарплата, CHARINDEX ('-', зарплата, 0) + 1, len (зарплата) -1), ']', '') как Splitted2 от сотрудника ) как t1 где @ var1> = Splitted1 и @ var1 <= Splitted2 </p>

https://rextester.com/l/sql_server_online_compiler

1 голос
/ 09 июля 2019

Вам необходимо извлечь числовые значения, а затем привести к числовому типу:

declare @mySalary money;
set  @mySalary = 1400;

with Employee(ID, Name, Salary ) as
(
 select 1,'John','[1300 - 2000]' union all
 select 2,'Aby','[600 - 1000]'   union all
 select 3,'Mike','[1000 - 1500]'
), e2 as
(
select SUBSTRING(Salary,PATINDEX('%[0-9]%', Salary),CHARINDEX('-',Salary)-2) as Salary1,
       SUBSTRING(Salary,CHARINDEX('-',Salary)+1,CHARINDEX(']',Salary)-CHARINDEX('-',Salary)-1) as Salary2,
       e.*
  from Employee e
)
select ID, Name, Salary
  from e2
 where @mySalary between cast(Salary1 as money) and cast(Salary2 as money);

ID  Name    Salary
1   John    [1300 - 2000]
3   Mike    [1000 - 1500]

Демо

1 голос
/ 09 июля 2019

Попробуйте этот запрос:

declare @tbl table (id int, name varchar(15), salary varchar(20));
declare @mySalary int = 1400;

insert into @tbl 
 select 1,'John','[1300 - 2000]' union all
 select 2,'Aby','[600 - 1000]'   union all
 select 3,'Mike','[1000 - 1500]'

select id, name, salary from (
    select id, name, salary,
           convert(int, substring(salary, openBrcktIdx + 1, hyphenIdx - openBrcktIdx - 2)) lowerBound,
           convert(int, substring(salary, hyphenIdx + 2, closeBrcktIdx - hyphenIdx - 2)) upperBound
    from (
        select *,
               charindex('-', salary) hyphenIdx,
               charindex('[', salary) openBrcktIdx,
               charindex(']', salary) closeBrcktIdx
        from @tbl
    ) t
) t where @mySalary between lowerBound and upperBound
1 голос
/ 09 июля 2019

Не следует хранить диапазоны в одном столбце. Но если Ты не можешь изменить это, то есть уединение:

SELECT  [Id] , name, 
      ,[salary] 
  FROM [Test Database].[dbo].[test] where 
1700 >= RTRIM(LTRIM(SUBSTRING(salary,0, CHARINDEX('-',salary)))) 
and 1700 <=  RTRIM(LTRIM(SUBSTRING(salary, CHARINDEX('-', salary) + 1, LEN(salary))))
...