Как найти значение MAX () символьного столбца? - PullRequest
2 голосов
/ 29 июля 2011

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

code
------
'001'    
'002'    
'099'

и т. Д.

Теперь у нас есть запрос объекта, в котором мы должны знатьMAX (код), чтобы дать пользователю следующее возможное значение, в приведенном выше примере формы следующим значением является '100'.

Мы пытались поэкспериментировать с этим, но мы все еще не можем найти какое-либо разумное объяснение того, как механизм DB2вычисляет, что

MAX ('001', '099', '576') равно '576'

MAX ('099', '99', 'www') равно '99'и т. д.

Буду признателен за любую помощь или предложение!

Ответы [ 4 ]

7 голосов
/ 30 июля 2011

У вас уже есть ответ на получение максимального числового значения, но вы ответите на другую часть относительно «www», «099», «99».

AS / 400 использует EBCDIC для хранения значений, это несколько отличается от ASCII, наиболее важным для ваших целей является то, что буквы Alpha предшествуют числам, что противоположно Ascii.

То же самое для вашего Max ()Ваши 3 строки будут отсортированы, и будет использовано наибольшее значение EBCDIC, поэтому

  • 'www'
  • '099'
  • '99 '

Как вы можете видеть, ваша строка '99' на самом деле '99 ', поэтому она выше, чем та, у которой ведущий ноль.

2 голосов
/ 29 июля 2011

Приведите его к int перед применением max ()

1 голос
/ 29 июля 2011

Для числового максимума - отфильтровать нечисловые значения и привести к числовому значению для агрегации:

SELECT MAX(INT(FLD1)) 
WHERE FLD1 <> ' ' 
AND TRANSLATE(FLD1, '0123456789', '0123456789') = FLD1

Справочник по SQL: ПЕРЕВОД


И разумное объяснение:

Справочник по SQL: MAX

1 голос
/ 29 июля 2011

Этот максимум хорошо работает в вашем определении типа, когда вы хотите сделать max для целочисленных значений, а затем преобразовать значения в целое число перед вызовом MAX, но я вижу, как вы смешиваете max со строкой 'www', как вы думаете, это работает?

Фильтровать только целочисленные значения, привести его к int и вызвать макс.Это не очень удачное решение, но я думаю, что достаточно взглянуть на вашу проблему.

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