按字符串和单词组合按ID排序

时间:2013-03-01 01:58:54

标签: sql oracle

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

假设我有这些数据:

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

当我使用此查询时:

select max(cust_id) from customer_table;

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

5 个答案:

答案 0 :(得分:1)

如果前缀的长度始终相同,则可以使用:

order by length(cust_id) desc, cust_id desc

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

答案 1 :(得分:1)

我假设你想按customerid字段的数量排序?假设是这样,您可以使用REGEXP_REPLACECAST

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

SQL Fiddle Demo

这里还有一个Demo返回场地:http://www.sqlfiddle.com/#!4/406c7/6

答案 2 :(得分: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字符串转换为等效的数字格式。

答案 3 :(得分:0)

Select SCOPE_IDENTITY() from customer_table;

答案 4 :(得分:0)

我同意 - 你的数据库设计并不完美:) 但您可以使用此类查询进行一些解决方法

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

和一个基于函数的加速指数

create index ndxCustomerNumber on customer(TO_NUMBER(SUBSTR(cust_id, 9)));