Сведения о вопросе

ЧОВИД

23:05, 24th August, 2020

Теги

sql-server    

Получить число из диапазона строк sql

Просмотров: 356   Ответов: 8

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

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

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

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

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

Есть какие-нибудь идеи?



  Сведения об ответе

FAriza

03:34, 6th August, 2020

Попробовать это,

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

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


  Сведения об ответе

qwerty101

14:42, 23rd August, 2020

@Martin: ваше решение работает.

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

select cast(replace(replace(replace(interest,'<',''),'%',''),'-','.0') as numeric) test
from table1 where interest is not null


  Сведения об ответе

#hash

18:49, 9th August, 2020

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


  Сведения об ответе

PHPH

10:32, 6th August, 2020

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

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

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

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

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

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


  Сведения об ответе

DAAA

16:48, 23rd August, 2020

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


  Сведения об ответе

lesha

11:08, 16th August, 2020

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

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

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

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


  Сведения об ответе

FAriza

02:48, 8th August, 2020

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

Чтобы спроектировать себя из этого создайте таблицу 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.


  Сведения об ответе

PAGE

21:22, 5th August, 2020

Это сложно, но для тестовых случаев, которые вы предоставили, это работает. Просто замените @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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться