2016-09-30 19 views
1

SELECTのソート方法は?数字、長さ、文字でSQLをソートする方法はありますか?

例のLIST

1, 2, 2A, 4, 10, 10A 

SQL

$query = "SELECT * FROM table WHERE column1 = '$var' ORDER BY length(column2), column2"; 

I ORDER BY length()もし私の例のように、図2(a)は、底になってしまいます。
length()を削除した場合、10は1になります。

上記のようにソートするにはどうすればよいですか?六角によって

$query = "SELECT * FROM table WHERE column1 = '$var' ORDER BY CAST(column2 as UNSIGNED), column2"; 
+0

[ここでは非常に似ていますが、ストリング数の計算を逆にする](http://stackoverflow.com/questions/4939518/sorting-string-column-containing-numbers-in-sql)最大の問題は、あなたがどれくらいの時間数がわからないのですか – Draken

答えて

0

$query = "SELECT *, cast(hex(column2 as unsigned) as l FROM table WHERE column1 = '$var' ORDER BY l"を。

+0

魅力のように動作します。ありがとうございました! –

+0

私は助けることができてうれしいです。 –

0

順番はこれを行うための最善の方法である:このよう

0

alphasのようなカスタム関数では、hereが見つかった場合は、最初に値の数値部分の後に値の文字列部分を指定して注文することができます。

、ユーザーが定義し、そのようにテーブルを移入した場合:

CREATE TABLE test (t VARCHAR(255)); 
INSERT INTO test VALUES 
    ('10A'), 
    ('2'), 
    ('2A'), 
    ('4'), 
    ('10'), 
    ('1'); 

そして、カスタム関数を作成するには、文字列の部分(無番号)を抽出するalphasと呼ば:

DELIMITER | 
DROP FUNCTION IF EXISTS alphas; 
CREATE FUNCTION alphas(str CHAR(32)) RETURNS CHAR(16) 
BEGIN 
    DECLARE i, len SMALLINT DEFAULT 1; 
    DECLARE ret CHAR(32) DEFAULT ''; 
    DECLARE c CHAR(1); 
    SET len = CHAR_LENGTH(str); 
    REPEAT 
    BEGIN 
     SET c = MID(str, i, 1); 
     IF c REGEXP '[[:alpha:]]' THEN 
     SET ret=CONCAT(ret,c); 
     END IF; 
     SET i = i + 1; 
    END; 
    UNTIL i > len END REPEAT; 
    RETURN ret; 
END | 
DELIMITER ; 

次に、あなたが行うことができます

SELECT t FROM test ORDER BY CAST(t AS UNSIGNED), alphas(t); 

CAST関数は、10Aのような文字列を符号なしの数値10に変換します。

関連する問題