假设我有一个表,其中包含发票编号列,数据类型为VARCHAR,混合字符串/int值如下:
invoice_number ************** HKL1 HKL2 HKL3 ..... HKL12 HKL13 HKL14 HKL15
我试着选择它的最大值,但它返回“HKL 9”,而不是最高值“HKL 15”。
SELECT MAX( invoice_number ) FROM `invoice_header`
vlju58qv1#
HKL9(string)大于HKL15,因为它们是作为字符串进行比较的。处理此问题的一种方法是定义一个列函数,该函数仅返回发票编号的数字部分。如果所有发票编号都以HKL开头,则可以用途:
HKL9
HKL15
HKL
SELECT MAX(CAST(SUBSTRING(invoice_number, 4, length(invoice_number)-3) AS UNSIGNED)) FROM table
它取invoice_number(不包括前3个字符),转换为int,然后从中选择max。
wswtfjt72#
select ifnull(max(CONVERT(invoice_number, SIGNED INTEGER)), 0) from invoice_header where invoice_number REGEXP '^[0-9]+$'
nbewdwxp3#
经过一段时间的搜索,我找到了最简单的解决方案。
select MAX(CAST(REPLACE(REPLACE(invoice_number , 'HKL', ''), '', '') as int)) from invoice_header
qyyhg6bp4#
这也应该起作用
SELECT invoice_number FROM invoice_header ORDER BY LENGTH( invoice_number) DESC,invoice_number DESC LIMIT 0,1
hgqdbh6s5#
你的问题更多的是定义和设计。
**选择ID或DATE最高的发票号,**或者--如果它们 * 真的 * 与“最高发票号”不相关--定义一个附加列,该列与发票号相关,并且对于较差的数据库来说足够简单以便于理解。
select INVOICE_NUMBER from INVOICE_HEADER order by ID desc limit 1;
这并不是说数据库不够智能,而是你问错了问题。
i1icjdpr6#
可使用以下查询:select max(cast((CASE WHEN max_no NOT LIKE '%[^0-9]%' THEN max_no END) as int)) AS max_int_no from table1
select max(cast((CASE WHEN max_no NOT LIKE '%[^0-9]%' THEN max_no END) as int)) AS max_int_no from table1
polhcujo7#
对于mysql数据库我使用如下:
SELECT CONCAT('HK','L',MAX(ABS(SUBSTRING_INDEX(invoice_number,'L', -1))))AS maxInvoice FROM invoice_header
因为所有的发票号都可以用字母“L”作为分隔符,所以使用-〉SUBSTRING_INDEX()函数来拆分发票号,然后使用concat()函数将它们再次连接起来以获得最大发票号。
7条答案
按热度按时间vlju58qv1#
HKL9
(string)大于HKL15
,因为它们是作为字符串进行比较的。处理此问题的一种方法是定义一个列函数,该函数仅返回发票编号的数字部分。如果所有发票编号都以
HKL
开头,则可以用途:它取invoice_number(不包括前3个字符),转换为int,然后从中选择max。
wswtfjt72#
nbewdwxp3#
经过一段时间的搜索,我找到了最简单的解决方案。
qyyhg6bp4#
这也应该起作用
hgqdbh6s5#
你的问题更多的是定义和设计。
**选择ID或DATE最高的发票号,**或者--如果它们 * 真的 * 与“最高发票号”不相关--定义一个附加列,该列与发票号相关,并且对于较差的数据库来说足够简单以便于理解。
这并不是说数据库不够智能,而是你问错了问题。
i1icjdpr6#
可使用以下查询:
select max(cast((CASE WHEN max_no NOT LIKE '%[^0-9]%' THEN max_no END) as int)) AS max_int_no from table1
polhcujo7#
对于mysql数据库我使用如下:
因为所有的发票号都可以用字母“L”作为分隔符,所以使用-〉SUBSTRING_INDEX()函数来拆分发票号,然后使用concat()函数将它们再次连接起来以获得最大发票号。