MySQLクエリでテキストを数値に変換する


137

MySQLクエリ内でテキストを数値に変換することは可能ですか?「name-number」の形式の名前と番号で構成される識別子を持つ列があります。列はVARCHARタイプです。行を番号(同じ名前の行)でソートしたいのですが、列は文字順でソートされます。

name-1
name-11
name-12
name-2

数値を切り取った場合、「varchar」の数値を「実際の」数値に変換し、それを使用して行をソートできますか?以下の注文をお願いします。

name-1
name-2
name-11
name-12

番号を別の列として表すことはできません。

編集2011-05-11 9:32

私は次の解決策を見つけました... ORDER BY column * 1。名前に数字が含まれない場合、そのソリューションを使用することは節約できますか?


1
名前は正確に名前ですか、それとも任意の文字にすることができますか?つまり、4文字の文字列ですか、それとも本名ですか?
Marco、

name任意の文字列を使用できます。
czuk

回答:


256

これはうまくいくはずです:

SELECT field,CONVERT(SUBSTRING_INDEX(field,'-',-1),UNSIGNED INTEGER) AS num
FROM table
ORDER BY num;

1
説明とドキュメントへのリンクを追加できますか?
アンジェロフックス2017

私の文字列は「name-abc12」のようなものです。コードを追加すると、「-」の後の最初の文字が文字で始まっていない場合にのみ機能します。@Marco where条件なしで文字を無視する方法を教えてもらえますか?
エドゥアルド

1
@Eduardo私のクエリは、「-」の後に文字列を取得して数値に変換することになっています(数値である必要があります)。あなたの場合、私はおそらく正規表現を使い
Marco

@Marco正規表現がそれを行いました、ヒントをありがとうございます。
エドゥアルド

32

あなたは使用することができますSUBSTRINGCONVERT

SELECT stuff
FROM table
WHERE conditions
ORDER BY CONVERT(SUBSTRING(name_column, 6), SIGNED INTEGER);

name_column「name-」値を含む列はどこにありますか。SUBSTRING6番目の文字(すなわち「名- 」プレフィックス)の前に、すべてアップを削除し、CONVERT変換は、実際の整数に残さ。

更新:コメントの変化する状況(つまり、プレフィックスは何でもかまいません)を考えるとLOCATE、ミックスでaをスローする必要があります。

ORDER BY CONVERT(SUBSTRING(name_column, LOCATE('-', name_column) + 1), SIGNED INTEGER);

もちろんこれは、数値以外の接頭辞にハイフンが含まれていないことを前提としていますが、関連するコメントには次のように記載されています。

name 任意の文字列にすることができます

それは安全な仮定であるべきです。


私のコメントに答えて、彼は名前に任意の文字シーケンスを使用できると私に言ったので、を使用できるかどうかはわかりませんSUBSTRING(name_column, 6)。私が知っている、あなたが彼が私たちにこれを言わなかったときにあなたがそれを投稿した...
マルコ

@Marco:お知らせありがとうございます。プレフィックスに関する新しい情報を処理する更新を追加しました。ええ、SUBSTRING_INDEXの方がいいです。
muが短すぎる

22

CASTを使用するだけで、

CAST(column_name AS UNSIGNED)

キャスト結果のタイプは、次のいずれかの値になります。

BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL[(M[,D])]
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]

14

CAST()を使用して、文字列からintに変換できます。例えばSELECT CAST('123' AS INTEGER);


15
そのバージョンは固有ですか?使用するSELECT CAST('123' AS SIGNED INTEGER);SELECT CAST('123' AS UNSIGNED INTEGER);、機能させる必要があります。
Hobo 2013

10
SELECT *, CAST(SUBSTRING_INDEX(field, '-', -1) AS UNSIGNED) as num FROM tableName ORDER BY num;

1
ORDER BYは、CONVERTを使用せずにnumを数値として使用しますか?よくわかりませんが、それは可能です。私は自分自身に問いかけています:)
Marco

4

1つの簡単な方法SELECT '123' + 0


このコードは問題の解決に役立つ可能性がありますが、なぜまたはどのように質問に回答するに関する追加のコンテキストを提供すると、長期的な価値が大幅に向上します。回答を編集して説明を追加してください。
Toby Speight

これは質問には答えませんでしたが、私が探していた答えでした。
Sagar Shah

あなたの解決策は最もエレガントで実用的です-残念ながら、あなたは質問の文脈でそれを与えられた例の具体的な表現で提供しませんでした-それを具体的になるように修正してください。
chukko


2

主キーが

ABC / EFG / EE / 13/123(シーケンス番号)のような形式の文字列である場合、
この種類の文字列は、区切り文字( "/")を使用した並べ替えに簡単に使用できます。

次のクエリを使用して、このタイプのキーでテーブルを注文できます

SELECT * FROM `TABLE_NAME` ORDER BY 
CONVERT(REVERSE(SUBSTRING(REVERSE(`key_column_name`), 1, LOCATE('/', REVERSE(`key_column_name`)) - 1)) , UNSIGNED INTEGER) DESC


-5

一般的な方法:

SELECT * FROM your_table ORDER BY LENTH(your_column) ASC, your_column ASC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.