Получить максимальное число в столбце varchar SQL Server - PullRequest
0 голосов
/ 29 июня 2018

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

+-------------------+--------------+
| reference_no      | Name         |
+-------------------|--------------+
| 17530, 20327      | John         |
| , 14864           | Smith        |
| 8509              | Michael      |
| 14864, 17530      | Kelly        |
+-------------------+--------------+

Итак, в приведенном выше примере столбца (reference_no) результат должен быть 20327.

Затем я должен выбрать строку, которая содержит это число.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

попробуйте следующее:

declare @tab table (reference_no varchar(max), [Name] varchar(100))
insert into @tab
select  '17530, 20327','John'    union
select  ', 14864     ','Smith'   union
select  '8509        ','Michael' union
select  '14864, 17530','Kelly' 

create table #final (val int)

insert into #final
    SELECT Split.a.value('.', 'VARCHAR(100)') AS String
    FROM  (SELECT reference_no reference_no,  
            CAST ('<S>' + REPLACE(reference_no, ',', '</S><S>') + '</S>' AS XML) AS String  
        FROM @tab) AS A CROSS APPLY String.nodes ('/S') AS Split(a);

select * from @tab where reference_no like '%'+ (select convert(varchar(100), max(val)) from #final) + '%'
drop table #final
0 голосов
/ 29 июня 2018

Предположим, НЕ 2016 +

Если у вас есть не более 4 значений в reference_no в какой-либо конкретной строке, то, возможно, parsename()

Если их больше 4, вам может потребоваться исправить данные или использовать функцию разделения / разбора.

Пример

Select MaxValue = max(V)
 From  YourTable A
 Cross Apply ( values (replace([reference_no],',','.')) ) B(S)
 Cross Apply ( values (try_convert(int,parsename(S,1)))
                     ,(try_convert(int,parsename(S,2)))
                     ,(try_convert(int,parsename(S,3)))
                     ,(try_convert(int,parsename(S,4)))
             ) C(V)

Возвращает

MaxValue
20327
...