3

テーブルADDRESSに VARCHAR2 である列DOORがあります。列DOORをソートしたい。

DOOR には 2 桁のみが含まれ、-符号はありません

現在、クエリを使用するとき

select sname, door, zip from address a order by door

次の結果が得られます。

a
b
1
10
11
2
3
31

しかし、私は結果を次のようにしたい:

a
b
1
2
3
10
11
31

asを使ってDOOTを数値に変換してみましたto_number

select sname, to_number(door) dnr, zip from address a order by dnr

しかし、それは私にエラーを与えていますORA-01722

4

4 に答える 4

3

ORA-01722値 'a'、'b' が原因でエラーが発生しました。varchar を受け取り、変換する数値を返すカスタム関数を使用しorder byてください。クエリの句でカスタム関数を使用してください。

CREATE OR REPLACE FUNCTION tonumber (no_str varchar2)
        RETURN number IS
           num number := 0;
        BEGIN
           RETURN to_number(no_str);
        EXCEPTION  -- exception handlers begin A < B < 1 < 2
           WHEN value_error THEN  -- handles all other errors
               dbms_output.put_line('in other exception catch.');
               CASE
                  WHEN ( upper(no_str) = 'B' )  THEN  return -1;
                  WHEN ( upper(no_str) ='A') THEN return -2;
                  ELSE return -999;
               END CASE;
        END;

必要に応じて when 条件を追加します。A B のみを持つことができると仮定します。残りの場合はデフォルトを返します。

于 2013-08-21T17:05:27.017 に答える
1

(このアプローチは、「234abc567」のような混合値が存在しないことを前提としています。)

したがって、古い学校に行く...文字列が文字として適切にソートされるように、列の最大長まで文字列を0で埋めます。ただし、「数値以外」の値を最初に並べ替えるには、数値以外の値を無効にし、最初に NULL を配置し、その後に値を埋め込みます。

select door
  from address
 order by case when replace(translate(door, '012345679', '0000000000'), '0', '') is null 
               then lpad(door, 10, '0') -- value was entirely made of digits (change the 10 to the max width of the column)
               else null 
           end nulls first
        , door -- sorting within the group of NULL rows generated in the previous expression.
于 2013-08-21T20:07:36.120 に答える