Получить номер из строки строки sql


2

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

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

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

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

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

Любые идеи?

5

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

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

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

  0

не будет работать, если сказать, что значение в столбце ABCD2 09 янв. 102010-01-09 07:42:04


0

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


0

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

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

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

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

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

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


0

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


0

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

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

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

Просто установите результирующие значения обратно к столу


0

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

Чтобы спроектировать себя из этого создать диапазон_просмотр таблицы:

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. 

2

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

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

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

0

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