Получить число из диапазона строк SQL - PullRequest
2 голосов
/ 20 августа 2008

У меня есть столбец данных, который содержит процентный диапазон в виде строки, которую я хотел бы преобразовать в число, чтобы можно было легко сравнивать.

Возможные значения в строке:

'<5%'
'5-10%'
'10-15%'
...
'95-100%'

Я бы хотел преобразовать это в предложении select where только в первое число, 5, 10, 15 и т. Д., Чтобы я мог сравнить это значение с переданным значением "хотя бы этим".

Я пробовал несколько вариантов подстроки, charindex, convert и replace, но я все еще не могу получить что-то, что работает во всех комбинациях.

Есть идеи?

Ответы [ 8 ]

5 голосов
/ 20 августа 2008

Попробуйте это,

SELECT substring(replace(interest , '<',''), patindex('%[0-9]%',replace(interest , '<','')), patindex('%[^0-9]%',replace(interest, '<',''))-1) FROM table1 

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

2 голосов
/ 20 августа 2008

@ Мартин: Ваше решение работает.

Вот еще один, который я придумал на основе вдохновения от @ mercutio

select cast(replace(replace(replace(interest,'<',''),'%',''),'-','.0') as numeric) test
from table1 where interest is not null
0 голосов
/ 20 августа 2008

Это сложно, но для предоставленных вами тестовых случаев это работает. Просто замените @Test на столбец, который вы просматриваете в своей таблице.

DECLARE @TEST varchar(10)

set @Test =  '<5%'
--set @Test =  '5-10%'
--set @Test =  '10-15%'
--set @Test =  '95-100%'

Select CASE WHEN 
Substring(@TEST,1,1) = '<' 
THEN 
0
ELSE 
CONVERT(integer,SUBSTRING(@TEST,1,CHARINDEX('-',@TEST)-1))
END
AS LowerBound
,
CASE WHEN 
Substring(@TEST,1,1) = '<'
THEN
CONVERT(integer,Substring(@TEST,2,CHARINDEX('%',@TEST)-2))
ELSE
CONVERT(integer,Substring(@TEST,CHARINDEX('-',@TEST)+1,CHARINDEX('%',@TEST)-CHARINDEX('-',@TEST)-1))
END
AS UpperBound
0 голосов
/ 20 августа 2008

Проблема, с которой вы столкнулись, является признаком несоблюдения данных. В этом случае это выглядит просто непреднамеренно (Legacy), но вот ссылка об этом.

Чтобы создать себя из этого, создайте таблицу range_lookup:

Create table rangeLookup(
    rangeID int  -- or rangeCD or not at all
    ,rangeLabel varchar(50)
    ,LowValue int--real or whatever
    ,HighValue int 
)

Взломать себе здесь несколько псевдо-шагов, это будет глубоко вложенный беспорядок.

normalize your input by replacing all your crazy charecters.
    replace(replace(rangeLabel,"%",""),"<","")
    --This will entail many nested replace statments.

Add a CASE and CHARINDEX to look for a space if there is none you have your number
    else use your substring to take everything before the first " ".
    -- theses steps are wrapped around the previous step.
0 голосов
/ 20 августа 2008

Вы можете сделать это на сервере SQL с помощью курсора. Если вы можете создать функцию CLR, чтобы вытянуть группы номеров, которые помогут. Это возможно в T-SQL, просто будет ужасно.

Создать курсор для циклического перемещения по списку. Найдите первое число, если в их группе всего 1 группа, а затем верните его. В противном случае найдите вторую группу товаров.

, если возвращена только 1-я группа элементов, и для ее первого элемента в списке устанавливается верхняя граница. если возвращена только 1-я группа элементов и последний элемент в списке устанавливает нижнюю границу. В противном случае установите для 1-й группы элементов значение ниже, а для 2-й группы элементов - верхнюю границу

.

Просто установите полученные значения обратно в таблицу

0 голосов
/ 20 августа 2008

Вам, вероятно, будет гораздо лучше изменить <5% и 5-10%, чтобы сохранить 2 значения в 2 полях. Вместо хранения <5% вы должны хранить 0 и 5, и вместо 5-10% вы получите 5 и 10. В итоге вы получите 2 столбца, один с именем lowerbound, а другой с именем upperbound, а затем просто проверьте значение >= нижний предел И значение < верхний предел.

0 голосов
/ 20 августа 2008

Я не знаю, работает ли это в SQL Server, но в MySQL вы можете использовать несколько приемов для преобразования символьных данных в числа. Примеры из ваших образцов данных:

"<5%"     => 0
"5-10%"   => 5
"95-100%" => 95

теперь, очевидно, это проваливает ваш первый тест, но некоторых умных замен строк в начале строки будет достаточно, чтобы заставить ее работать.

Один из примеров преобразования символьных данных в числа:

SELECT "5-10%" + 0 AS foo ...

Может не работать в SQL Server, но будущие поиски могут помочь нечетному пользователю MySQL: -D

0 голосов
/ 20 августа 2008

Вы можете преобразовывать данные char в другие типы char (конвертировать char (10) в varchar (10)), но вы не сможете преобразовать символьные данные в целочисленные данные из SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...