在VARCHAR字段中使用MAX()函数

13

我有一个包含以下数据集的表格

ID (VARCHAR2 field)
D001
D002
D010
D0012

我在这个字段中使用max()

Select max(ID) from <table-name>;

它返回结果为D010

为什么结果不是D0012


6
Lexicographical order(词典序)是指将一组字符串按照字母表顺序排序的方式。在这种排序方式下,首先比较字符串的第一个字符,如果相同则比较第二个字符,以此类推直到找到两个不同的字符为止。如果一个字符串已经结束而另一个字符串还没有结束,则较短的字符串被认为在较长的字符串之前。这种排序方式通常用于计算机科学中的字符串比较和数据排序。 - OMG Ponies
4
这是一个varchar字段,为什么要按数字排序? - Kirk Woll
6个回答

31

你收到 D010 是因为按字母顺序,D010D0012 之后,或者说,D01D00 之后,因此任何以 D01x 开头的内容都在以 D00x 开头的内容之后。


1
这里有一个例子,如何处理这样的问题--https://dev59.com/gGQn5IYBdhLWcg3w5aay#16496963 - trejder

5
以下代码按照您的预期能够工作:
select max(to_number(regexp_substr(id, '\d+'))) id from <yourtable>;

1
SELECT * 
FROM  `<TABLE_NAME>` 
ORDER BY CAST(  `ID` AS DECIMAL( 10, 3 ) ) DESC 

0

这应该可以工作

Select MAX(ID) from table where IsNumeric(ID) = 1 ; 

0

需要将第一个Varchar强制转换为int才能选择MAX。使用以下查询:

select max(CAST(ID as signed)) as max_id from <table-name>;


0

这肯定会起作用。

    select MAX(CAST(REPLACE(REPLACE(ID, 'D', ''), '', '') as int)) from <table-name>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接