我有一个客户表,在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查询标准中?
答案 0 :(得分:1)
如果前缀的长度始终相同,则可以使用:
order by length(cust_id) desc, cust_id desc
这不是一个非常标准的SQL,因为有些数据库使用len()
而不是length()
。字符串函数往往因数据库而异,所以我不确定是否存在纯数据库兼容的方法(replace
在数据库中可能很常见)。
答案 1 :(得分:1)
我假设你想按customerid字段的数量排序?假设是这样,您可以使用REGEXP_REPLACE
和CAST
:
SELECT MAX(CAST(REGEXP_REPLACE(YourField, '[^0-9]+', '') as Number))
FROM TableName
这里还有一个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)));