2017-06-07 3 views
-1

Oracleでカスタムオーダーで列をソートする際に問題があります。Oracleカスタムソートが機能していません

最初に列に特定の行が必要ですが、残りの項目はアルファベット順に下に表示されます。列には、アルファベット、数字、特殊文字で始まるデータがあります。ASCで列をソートしようとするたびに、最初に数字とアルファベットに続く特殊文字で始まるものが返されます。

Egが順番

ACCOUNT_NAME 
------------- 
First Row 
Alpha Row 
Fifth Row 
Fourth Row 
Second Row 
Third Row 
4Number Row 
$Specialchar Row 

以下に、私は以下のクエリを実行しようとしたが、仕事

SELECT ACCOUNT_NAME FROM ACCOUNT 
    ORDER BY decode(ACCOUNT_NAME,'First Row',1), 
    regexp_substr(UPPER(ACCOUNT_NAME), '^[a-zA-Z]') ASC; 
+1

はなぜべきです」最初の行が最初に来る?それはハードコードされた値ですか? – Aleksej

+0

試行されたクエリのどのビットが機能しないのですか?どのような結果が得られますか、なぜ間違っていますか? (「第1行」とは別に、名前の最初のアルファベット文字でソートするだけで、正規表現は間違っているので、「Fourth」と「Fifth」は順不同かもしれませんが、もしかして...)。 –

答えて

0

であるように思われません

ACCOUNT_NAME 
------------- 
First Row 
Second Row 
Third Row 
Fourth Row 
Fifth Row 
$Specialchar Row 
4Number Row 
Alpha Row 

期待される結果を結果セットASCII関数があなたの問題を解決すると思います。ただし、値の1番目の文字に基づいてソートするのは簡単です。 など。 'AA'は '11'の前に来るでしょう。これは '$$'の前に来ます。しかし、 'A $'は 'A4'の前に来るでしょう。あなたがプログラムをすべての文字に伸ばさない限り、 'AA'の前に来ます。これを拡張するのはかなり面倒です。

コードは次のとおりです。

WITH data_set AS 
    (SELECT '001' emp_id, 'aaa' emp_name, '005' mgr_id 
     FROM DUAL 
     UNION 
     SELECT '005' emp_id, 'bbb' emp_name, '010' mgr_id 
     FROM DUAL 
     UNION 
     SELECT '010' emp_id, 'ccc' emp_name, '050' mgr_id 
     FROM DUAL 
     UNION 
     SELECT '020' emp_id, '4xy' emp_name, '050' mgr_id 
     FROM DUAL 
     UNION 
     SELECT '050' emp_id, '$52' emp_name, '100' mgr_id 
     FROM DUAL 
     UNION 
     SELECT '100' emp_id, '555' emp_name, '200' mgr_id 
     FROM DUAL 
     UNION 
     SELECT '200' emp_id, '@$' emp_name, NULL mgr_id 
     FROM DUAL) 
SELECT emp_name, 
     CASE 
      WHEN (ASCII (emp_name) BETWEEN 65 AND 90) 
      OR (ASCII (emp_name) BETWEEN 97 AND 122) 
       THEN 1 
      WHEN ASCII (emp_name) BETWEEN 48 AND 57 
       THEN 2 
      ELSE 3 
     END val 
    FROM data_set 
ORDER BY val; 
2

私はよく理解していれば、あなたがこの方法を注文したい:

  1. ハードコードされた値が始まるアルファベット順の文字で始まる最初の
  2. 文字列、
  3. 文字列として提供されます
  4. ASCII値に基づく他のすべての文字列

もしそうなら、あなたは順番に使用する値を構築するためにケースを使用することがあります。

どのように動作
/* sample data */ 
with example(ACCOUNT_NAME) as (
    select 'First Row' from dual union all 
    select 'Second Row' from dual union all 
    select 'Third Row' from dual union all 
    select 'Fourth Row' from dual union all 
    select 'Fifth Row' from dual union all 
    select '$Specialchar Row' from dual union all 
    select '4Number Row' from dual union all 
    select 'Alpha Row' from dual 
) 
/* query */ 
select * 
from example 
order by case 
      when account_name = 'First Row' then 1 
      when regexp_like(account_name, '^[A-Za-z]') then 2 
      when regexp_like(account_name, '^[0-9]') then 3 
      else 4 
     end, 
     account_name 

select case 
      when account_name = 'First Row' then 1 
      when regexp_like(account_name, '^[A-Za-z]') then 2 
      when regexp_like(account_name, '^[0-9]') then 3 
      else 4 
     end as orderByValue, 
     account_name 
from example 
order by case 
      when account_name = 'First Row' then 1 
      when regexp_like(account_name, '^[A-Za-z]') then 2 
      when regexp_like(account_name, '^[0-9]') then 3 
      else 4 
     end, 
     account_name 

が与える:

ORDERBYVALUE ACCOUNT_NAME 
------------ ---------------- 
      1 First Row 
      2 Alpha Row 
      2 Fifth Row 
      2 Fourth Row 
      2 Second Row 
      2 Third Row 
      3 4Number Row 
      4 $Specialchar Row 
+0

Aleksejさん、ありがとうございました。現在、期待どおりに働いています。 –

+0

@MUTHUKUMAR - [あなたはこの回答を受け入れることをお勧めします](https://stackoverflow.com/help/someone-answers)。 –

関連する問題