0

SQL 列に次のデータがあります。列の型は文字列です。DB からクエリを実行するときにこのデータを並べ替えたいと思いますが、SQL クエリが完了した後で Ruby マジックを使用して整理できると思います。他の列が引き出されているため、これは並べ替える必要がある列の 1 つにすぎません。

Expenses
$3500/MONTH
$1,000.00
STANDARD CONTRACTOR
$5,000.00

データは変更できず、同じ列に格納する必要があります (上記の例はテスト データのみ)。

数値を増やしてから残りの (文字列) 値を増やしてデータを整理したいと思います。期待される結果は次のとおりです。

$1,000.00
$5,000.00
$3500/MONTH
STANDARD CONTRACTOR

また

$1,000.00
$5,000.00
STANDARD CONTRACTOR
$3500/MONTH
4

3 に答える 3

1

オプション1(ここでフィドル)

select expenses from table1
order by
  replace(replace(expenses, "$", ""), ",", "") regexp "[0-9.]*" desc,
  case when replace(replace(expenses, "$", ""), ",", "") regexp "[0-9.]*"
    then cast(replace(replace(expenses, "$", ""), ",", "") as real)
    else 0
  end

オプション 2 (ここでフィドル):

select expenses from (
    select expenses,
      replace(replace(expenses, "$", ""), ",", "") expensesNormalized
    from table1
) s
order by
  expensesNormalized regexp "[0-9.]*" desc,
  case when expensesNormalized regexp "[0-9.]*"
    then cast(expensesNormalized as real)
    else 0
  end

速く走る方を選びましょう。

于 2012-11-19T01:06:02.293 に答える
0

既存の回答が SQLlite で機能する場合は、おそらくそれらが機能するでしょう。データはかなり... 乱雑なので...私は、ソートされた配列を返す単一のメソッドでこの醜い部分をカプセル化しようとする傾向があります。

このように行数が少ない場合 (例: 500 未満)、ソートするよりクリーンな方法は、 Comparable を含めてカスタム コンパレータを作成することです

于 2012-11-19T02:03:32.260 に答える
0

SQL Server では、次のようなことができます。

order by (case when isnumeric(col) = 1 then 1 else 0 end) desc,
         (case when isnumeric(col) = 1 then cast(col as money) end),
         col

他のデータベースの場合、isnumeric ではなく正規表現マッチングを使用して、どれが数値かを判断できます。

あなたは SQLite を使用しており、すべての数字が「$」で始まると想定できるように思われるため、次のようなものがほとんど機能します。

order by (case when substr(col, 1, 1) = '$' then 1 else 0 end) desc,
         (case when substr(col, 1, 1) = '$' then cast(col as numeric) end),
         col

問題は、「$3,500/月」が数値として扱われることです。含まれている場合は、正規表現でこれを修正できます。または、「/」がこれらのケースを定義する場合は、次のような特定のものを使用できます。

order by (case when substr(col, 1, 1) = '$' and col not like '%/%' then 1 else 0 end) desc,
         (case when substr(col, 1, 1) = '$' and col not like '%/%' then cast(col as numeric) end),
         col
于 2012-11-19T00:04:17.253 に答える