2017-03-15 3 views
1

シナリオ:値が1,2,3および空白( "")として格納されているテーブルにcharフィールド(name:priority)があります。ソート/ソートの開始値を中から指定する - 進行中に開く

for each mytable no-lock by priority: 

このクエリは、空白、1,2,3の順にソートされます。

for each mytable no-lock by priority desc: 

このクエリは、3,2,1と空白のようなレコードをソートします。

しかし、私はこのようなレコードを並べ替える必要があります:1,2,3と空白。昇順ですが、ブランクをスキップして1から始まります。 進捗状況を整理する方法はありますか?

答えて

2

文字フィールドを使用しているため、数値は文字列として扱われます。文字列 "1"、 "2"、 "3"のASCII値は49,50,51です。進捗は空白( "")をASCII -1として扱います。それで、空白が最初に来るのです。

2つのFOR EACHステートメントを使用することをお勧めします。

FOR EACH mytable NO-LOCK WHERE mytable.priority <> "" BY priority: 

次に行う空白のレコード:

FOR EACH mytable NO-LOCK WHERE mytable.priority = "": 

あなたが手続き/関数内のビジネスロジックを持っている場合は、あなたが防ぐためにFOR EACHループ内からのものを実行することができます最初の非空白レコードを行いますコードの重複

+0

これはかなりそれをしません。パフォーマンスを最大限に引き出すには、優先順位がインデックスに登録されていること – bupereira

+0

@bupereira実際には、インデックスが重要とは思わない。少なくとも最初のFOR EACHでは:<>はテーブルスキャン/全インデックス検索をトリガーします。 – Jensd

+0

@TheDrooperそれは良い提案です。実際、私の場合、使用されるクエリは短く単純ではないので、すべての結果を一度に必要とします – Mahesh

1

テーブルのレコードが多すぎる場合は、レコードを新しい優先度の一時テーブルにコピーして、代わりに一時テーブルを並べ替えることができますか?

数百万のレコードがある場合、これはそうではないかもしれません!それでは、単に新しいフィールドを追加することを検討します。あなたがスキャンしているので

DEFINE TEMP-TABLE MyTable NO-UNDO 
    FIELD priority AS CHARACTER 
    FIELD txt  AS CHARACTER. 

CREATE MyTable. 
ASSIGN MyTable.priority = "1" 
     MyTable.txt  = "First?". 

CREATE MyTable. 
ASSIGN MyTable.priority = "" 
     MyTable.txt  = "Last?". 

DEFINE TEMP-TABLE ttMyTable NO-UNDO LIKE MyTable 
    FIELD newPriority AS INTEGER 
    INDEX sortOrder newPriority. 

FOR EACH MyTable NO-LOCK: 
    CREATE ttMyTable. 
    BUFFER-COPY MyTable TO ttMyTable 
     ASSIGN 
      ttMyTable.newPriority = IF MyTable.priority = "" THEN 99999 ELSE INTEGER(MyTable.priority). 
END. 

FOR EACH ttMyTable NO-LOCK BY ttMyTable.newPriority: 
    DISPLAY ttMyTable. 
END. 
+0

実際には、提供されている検索パラメータに基づいてクエリを準備する必要があるため、動的クエリを使用しています。 – Mahesh

1

/すべて/レコードが、とにかく、あなたはBYで並べ替えることができます:

define temp-table tt no-undo 
    field priority as character 
    . 

create tt. tt.priority = "". 
create tt. tt.priority = "1". 
create tt. tt.priority = "2". 
create tt. tt.priority = "3". 
create tt. tt.priority = "". 

for each tt by (if tt.priority = "" then "4" else tt.priority): 

    display string(rowid(tt)) tt.priority. 

end. 
関連する問題