2015-04-15 3 views
2

Я импортирую работу с данными, импортированными из файлов excel. Существует столбец со строкой, который может содержать несколько номеров. Я пытаюсь извлечь наибольшее число в строке или 0, если строки нет. Строки представлены в форматах, сходных с: «100% вторичная бумага после вторсырья, 50% пост-потребительская переработанная крышка, переработанная проволока на 90% после потребления». «Бумага содержит 30% контента пост-потребителя». или иногда пустую строку или null.Извлечь наибольшее число из строки в T-SQL

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

+0

Не можете ли вы сделать это в Excel до импорта? –

+0

Недостаточно информации для отправки ответа. –

ответ

0

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

Вставьте это в SSMS и запустите его, чтобы создать функцию. Для того, чтобы назвать его, сделать что-то вроде:

SELECT dbo.GetLargestNumberFromString(MyStringField) as [Largest Number in String] 
FROM MyMessedUpData 

Функция:

CREATE FUNCTION GetLargestNumberFromString 
(
@s varchar(max) 
) 
RETURNS int 
AS 
BEGIN 

    DECLARE @LargestNumber int, @i int 
    SET @i = 1 
    SET @LargestNumber = 0 

    WHILE @i <= LEN(@s) 
    BEGIN 

    IF SUBSTRING(@s, @i, 3) like '[0-9][0-9][0-9]' 
     BEGIN 
      IF CAST(SUBSTRING(@s, @i,3) as int) > @LargestNumber OR @LargestNumber IS NULL 
      SET @LargestNumber = CAST(SUBSTRING(@s, @i,3) as int); 
     END 

    IF SUBSTRING(@s, @i, 2) like '[0-9][0-9]' 
     BEGIN 
      IF CAST(SUBSTRING(@s, @i,2) as int) > @LargestNumber OR @LargestNumber IS NULL 
      SET @LargestNumber = CAST(SUBSTRING(@s, @i,2) as int); 
     END 

    IF SUBSTRING(@s, @i, 1) like '[0-9]' OR @LargestNumber IS NULL 
     BEGIN 
      IF CAST(SUBSTRING(@s, @i,1) as int) > @LargestNumber 
      SET @LargestNumber = CAST(SUBSTRING(@s, @i,1) as int); 
     END 

    SET @i = @i + 1 


    CONTINUE 
    END 
    RETURN @LargestNumber 
END 
1
  1. Вытащите данные в SQL как есть
  2. Напишите запрос, чтобы получить четкий список вариантов в этой колонке
  3. Добавить новый столбец для сохранения требуемого значения
  4. Написать оператор обновления для заполнить новый столбец

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

DECLARE @COUNTER INT=1000 
While EXISTS (SELECT * FROM <Table> WHERE NewColumn is NULL) AND @COUNTER>=0 
BEGIN 
    UPDATE <Table> SET [email protected] WHERE <SearchColumn> LIKE '%' + CONVERT(VARCHAR,@COUNTER) + '%' AND NewColumn is NULL 

    SET @[email protected] 
END 
+0

Почему OP должен вытащить все на SQL? –

+0

Потому что SQL легко манипулировать массой на – UnhandledExcepSean

+0

Разве ADODB недостаточно хорош? –

0

SQL Fiddle Demo

генерировать LEN(txt) возможные RIGHT() фрагменты txt. Обрезайте каждый фрагмент на первом несимметричном символе. Проверьте, есть ли остаток int. Верните MAX().

SELECT 
    txt 
,MAX(TRY_CONVERT(int,LEFT(RIGHT(txt,i),PATINDEX('%[^0-9]%',RIGHT(txt,i)+' ')-1))) 
FROM MyTable 
CROSS APPLY (
    SELECT TOP(LEN(txt)) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) i FROM master.dbo.spt_values a, master.dbo.spt_values b 
) x 
GROUP BY txt 
0

В результате я создал функцию, которая обрабатывала ее. Вот код:

CREATE FUNCTION [dbo].[cal_GetMaxPercentFromString] 

RETURNS float 
AS 
BEGIN 
    declare @Numbers Table(number float) 
    insert into @Numbers 
    Select 0 

    declare @temp as varchar(2000) = @string 
    declare @position int, @length int, @offset int 

    WHILE CHARINDEX('%', @temp) > 0 
    BEGIN 
     set @position = CHARINDEX('%', @temp) 
     set @offset = 1 
     set @length = -1 
     WHILE @position - @offset > 0 and @length < 0 
     BEGIN 
      if SUBSTRING(@temp, @position - @offset, 1) not LIKE '[0-9]' 
       set @length = @offset - 1  
      set @offset = @offset + 1 
     END 

     if @length > 0 
     BEGIN 
      insert into @Numbers 
      select CAST(SUBSTRING(@temp, @position - @length, @length) as float)    
     END 
     set @temp = SUBSTRING(@temp, 1, @position - 1) + SUBSTRING(@temp, @position + 1, LEN(@temp) - @position) 
    END 

    declare @return as float 
    select @return = MAX(number) from @Numbers 
    return @return 
END 
+0

Направляет вверх, ваша функция не принимает параметр. – TehJake