0

我有一个客户表,在 id(primary key) 中它与'customer'+sequential_number 组合在一起,

假设我有这些数据:

customer9998  | name1 | birtdate1
customer9999  | name2 | birtdate2
customer10000 | name3 | birtdate3
customer10001 | name4 | birtdate4

当我使用这个查询时:

select max(cust_id) from customer_table;

我得到了 customer9999,这是不正确的 - 任何建议如何做到这一点,特别是在 sql 查询标准中?

4

5 回答 5

1

如果前缀总是相同的长度,那么你可以使用:

order by length(cust_id) desc, cust_id desc

这不是标准的 SQL,因为一些数据库使用len()而不是length(). 字符串函数往往因数据库而异,所以我不确定是否有一种纯粹的数据库兼容方式来做到这一点(replace可能在数据库中很常见)。

于 2013-03-01T02:00:40.877 回答
1

您想选择最大的数字而不是字符串;所以你必须先拆分字符串。正确的答案是:

SELECT 'customer' || MAX(CAST(SUBSTR(CUST_ID, 9) AS NUMBER)) from CUSTOMER_TABLE;

SUBSTR(CUST_ID, 9)提取数字(现在是一个字符串)。

CAST(... AS NUMBER)将字符串转换为数值。

MAX(...)选择最大金额。

customer' || ...'customer'在此最大值之前 添加以将其转换回其原始形式。

请注意,当您比较两个字符串格式的数字时,结果可能与您比较数字格式的相同数字时不同。例如,在'9'和之间'1000000000000',最大金额'9'不是'1000000000000'。这是因为该操作获得了两个字符串中的最大值,而不是两个数字。因此,在获得最大值之前,您需要将 ID 字符串转换为其等效的数字格式。

于 2013-03-01T02:05:51.220 回答
1

我假设您想按 customerid 字段的数量进行排序?假设是这样,您可以使用REGEXP_REPLACEand CAST

SELECT MAX(CAST(REGEXP_REPLACE(YourField, '[^0-9]+', '') as Number))
FROM TableName

SQL 小提琴演示

这是一个返回字段的演示:http ://www.sqlfiddle.com/#!4/406c7/6

于 2013-03-01T02:03:45.110 回答
0
Select SCOPE_IDENTITY() from customer_table;
于 2013-03-01T02:01:41.070 回答
0

我同意 - 你的数据库设计并不完美 :) 但你可以用这样的查询做一些解决方法

select max(TO_NUMBER(SUBSTR(cust_id, 9))) from customer_table;

以及用于加速它们的基于函数的索引

create index ndxCustomerNumber on customer(TO_NUMBER(SUBSTR(cust_id, 9)));
于 2013-03-01T13:53:15.247 回答