0

顧客テーブルがあり、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クエリ標準でこれを行う方法の提案はありますか?

4

5 に答える 5

1

プレフィックスが常に同じ長さである場合は、次を使用できます。

order by length(cust_id) desc, cust_id desc

len()一部のデータベースはの代わりにを使用するため、これは完全に標準的なSQLではありませんlength()。文字列関数はデータベース間で異なる傾向があるため、これを行うための純粋にデータベース互換の方法があるかどうかはわかりません(replaceデータベース間で一般的である可能性があります)。

于 2013-03-01T02:00:40.877 に答える
1

顧客IDフィールドの数で並べ替えたいと思いますか?そうだとすると、あなたは使用することができREGEXP_REPLACEます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 に答える
1

文字列ではなく、最大数を選択する必要があります。したがって、最初に文字列を分割する必要があります。正解は次のとおりです。

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

SUBSTR(CUST_ID, 9)数値を抽出します(現在は文字列です)。

CAST(... AS NUMBER)文字列を数値に変換します。

MAX(...)最大量を選択します。

customer' || ...'customer'この最大値の直前に 追加して、元の形式に戻します。

文字列形式で2つの数値を比較する場合、数値形式で同じ数値を比較する場合とは結果が異なる場合があることに注意してください。たとえば、との間'9''1000000000000'は、最大量はではあり'9'ません'1000000000000'。これは、操作が2つの数値ではなく、2つの文字列の最大値を取得するためです。したがって、最大値を取得する前に、ID文字列を同等の数値形式に変換する必要があります。

于 2013-03-01T02:05:51.220 に答える
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 に答える