Выберите max int из столбца varchar - PullRequest
13 голосов
/ 04 февраля 2009

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

BoxNumber
123
A5
789
B1

Мне нужно вернуть наибольшее число (в данном случае 789) из столбца, игнорируя нечисловые значения A5 и B1.

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

Ответы [ 7 ]

26 голосов
/ 04 февраля 2009

вам нужна комбинация из-за того, что isnumeric возвращает 1 для следующих вещей

select isnumeric('+'),isnumeric('5d2') 

ваше предложение where будет таким

WHERE VALUE NOT LIKE '%[a-z]%'
        AND ISNUMERIC(VALUE) = 1

create table #bla (value varchar(50))
insert #bla values('123')
insert #bla values('a5')
insert #bla values('789')
insert #bla values('b1')

SELECT MAX(CAST(value AS Int)) FROM #bla
WHERE VALUE NOT LIKE '%[a-z]%'
    AND ISNUMERIC(VALUE) = 1

Я писал об этом здесь ISNUMERIC Trouble

8 голосов
/ 04 февраля 2009

Вы можете попробовать

Select MAX(BoxNumber) from {table} where IsNumeric(BoxNumber) = 1
4 голосов
/ 04 марта 2010

Почему бы не

SELECT MAX(CAST(Value AS Int)) FROM #bla 
WHERE ISNUMERIC(Value)=1 
    AND Value LIKE '%[0-9]%' 

тогда вы имеете дело только с числовыми строками. В этом случае вам может не понадобиться ISNUMERIC ()

3 голосов
/ 29 июля 2009

Выбранный ответ работал на меня, пока я не добавил это значение во временную таблицу вместе с другими в образце:

insert #bla values('1234')

Я ожидал, что мой результат max () будет теперь 1234, но он остался на уровне 789. Возможно, это связано с некоторыми настройками сортировки, но я смог воспроизвести на нескольких базах данных. Я обнаружил, что приведенный ниже запрос работает для меня, но мне, безусловно, было бы интересно узнать, есть ли более эффективный способ сделать это. Кроме того, я не хотел включать какие-либо десятичные значения, поэтому я также исключил что-либо с точкой.

SELECT MAX(CAST(Value AS Int)) FROM #bla 
WHERE ISNUMERIC(Value)=1 
    AND Value NOT LIKE '%[a-z]%' 
    AND Value NOT LIKE '%.%'
2 голосов
/ 04 февраля 2009

Вам следует проверить это решение на наличие значений, таких как '+' и '-', так как я думаю, что функция IsNumeric может возвращать 1 для этих значений

1 голос
/ 23 апреля 2014

Эти ответы только наполовину правы. Им удается изолировать числовые значения, но они не понимают, что когда базовое поле является числом, функция Max оценивает как символы (независимо от преобразования), читая слева направо, так что 789> 1000, потому что 7> 1. Обход возможно, стоит забыть о приведении чисел к левому значку с нулями до общей длины, когда должен работать Макс в символьном режиме.

1 голос
/ 04 февраля 2009

Посмотрите на приведение столбца к типу int, затем выберите MAX (). Я не знаю, что он будет делать со столбцами, которые содержат буквы, но это стоит изучить.

http://doc.ddart.net/mssql/sql70/ca-co_1.htm

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