11
SELECT `01` FROM perf WHERE year = '2013' order by CAST(`01` AS INT) LIMIT 3

列 01 には数値が varchar として含まれています。「01」の上位 3 つを整数として注文する必要があります。このクエリが機能しないのはなぜですか?

このようなテーブル;

+----------------------+
| name | 01 | 02 | year|
+----------------------+
|name1 | 90 |*** |2013 |
+----------------------+
|name2 | 93 | 55 |2013 |
+----------------------+
|name3 |*** | 78 |2013 |
+----------------------+

クエリは 01 (dismiss * ) で並べ替え、名前と値を指定する必要があります。

4

1 に答える 1

28

MySQLでは許可されていませんCAST('01' AS INT)SIGNED代わりにまたはを期待しUNSIGNEDます。

SELECT `01` FROM perf WHERE year = '2013' order by CAST(`01` AS SIGNED) LIMIT 3

詳細については、MySQLのドキュメントをCAST()確認してください。

mysql> SELECT CAST('01' AS SIGNED);
+----------------------+
| CAST('01' AS SIGNED) |
+----------------------+
|                    1 |
+----------------------+
1 row in set (0.00 sec)

CASE数値以外の文字列を強制的に最後に並べ替えるには、にを適用する必要があります。これにより、文字列に非常にORDER BY高い値が割り当てられます。01条件は、の値がに等しくないことをテストする必要があります。数値以外の文字列はゼロにキャストされるため0、結果にキャストすると結果はに等しくなりません。SIGNED0

これらの条件が満たされない場合、文字列は数値ではないと見なされ、の値が999999999になりORDER BY、最後にプッシュされます。その後、によって注文されnameます。

SELECT * FROM perf 
WHERE year = '2013'
ORDER BY
  CASE WHEN (`01` <> '0' AND CAST(`01` AS SIGNED) <> 0) THEN CAST(`01` AS SIGNED) ELSE 999999999 END,
  name
LIMIT 3

http://sqlfiddle.com/#!2/846e2/6

これらの並べ替えを降順にするには、高い値ではなく、途方もなく低い値(負)を使用します

  CASE WHEN (`01` <> '0' AND CAST(`01` AS SIGNED) <> 0) THEN CAST(`01` AS SIGNED) ELSE -999999999 END DESC,
于 2013-02-05T13:52:11.190 に答える