10進数からINTへのキャスト


81

私はこれをやろうとしています:

SELECT CAST(columnName AS INT), moreColumns, etc
FROM myTable
WHERE ...

私はここでヘルプFAQを見ました:http//dev.mysql.com/doc/refman/5.0/en/cast-functions.html、それは私がそれをすることができると言いますCAST(val AS TYPE)、しかしそれは機能していません。

10進数をintに変換しようとすると、実際の値は223.00で、223が必要です。


キャストの警告は、文字列を指定しているためですが、確認できますか?
ajreal 2011

マリアDBでも動作します
Niyati 2017

回答:


127

次のようなFLOOR関数を試すことができます。

SELECT FLOOR(columnName), moreColumns, etc 
FROM myTable 
WHERE ... 

小数点以下の桁数を省略できることがわかっている場合は、FORMAT関数を試すこともできます。

SELECT FORMAT(columnName,0), moreColumns, etc 
FROM myTable 
WHERE ... 

2つの機能を組み合わせることができます

SELECT FORMAT(FLOOR(columnName),0), moreColumns, etc 
FROM myTable 
WHERE ... 

2
SQLコードのフォーマットを正しく扱うべきではないことに気づきましたか?
fredley 2011

よくできました、+ 1。フォーマットは私の状況では問題なく機能しますが、CASTで誰かがそれを実行できるかどうかまだ疑問です
Drahcir 2011

@TomMedley:ええ、PHPも使用している場合は使用しませんが、これは一部のトリガーと関数のためだけです
Drahcir 2011

2
@TomMedleyもっと微妙な違いがあります。SQLクエリでのフォーマットは、ビューを作成するときに便利です。
VH-NZZ 2014

1
これにより、数値に千単位の区切り文字としてコンマが追加されます。
ヤン・スペイセク

22

より最適化された方法 この目的のために*:

SELECT columnName DIV 1 AS columnName, moreColumns, etc
FROM myTable
WHERE ...

DIV 1を使用すると、FORMATのような文字列ベースの関数は言うまでもなく、FLOORよりも大幅に速度が向上します。

mysql> SELECT BENCHMARK(10000000,1234567 DIV 7) ;
+-----------------------------------+
| BENCHMARK(10000000,1234567 DIV 7) |
+-----------------------------------+
|                                 0 |
+-----------------------------------+
1 row in set (0.83 sec)

mysql> SELECT BENCHMARK(10000000,1234567 / 7) ;
+---------------------------------+
| BENCHMARK(10000000,1234567 / 7) |
+---------------------------------+
|                               0 |
+---------------------------------+
1 row in set (7.26 sec)

mysql> SELECT BENCHMARK(10000000,FLOOR(1234567 / 7)) ;
+----------------------------------------+
| BENCHMARK(10000000,FLOOR(1234567 / 7)) |
+----------------------------------------+
|                                      0 |
+----------------------------------------+
1 row in set (8.80 sec)

(*)注:Grbtsが指摘しているように、符号なし/正の値で使用する場合のDIV1の動作に注意してください。


21

あなたがリンクした記事から:

タイプは、次のいずれかの値になります。

BINARY [(N)]

CHAR [(N)]

日付

日付時刻

DECIMAL [(M [、D])]

署名済み[整数]

時間

署名なし[整数]

SIGNED代わりに試してくださいINT


おかげで、今は別のエラーが発生します:エラーコード1292、SQL状態22001:データの切り捨て:切り捨てられた誤ったINTEGER値: '558.00'
Drahcir 2011


10

floor()とDIV 1には重要な違いがあります。負の数の場合、動作が異なります。DIV 1は整数部分を返し(符号付きのようにキャストされます)、floor(x)は「x以下の最大整数値」を返します(マニュアルから)。つまり、select floor(-1.1)は-2になり、select -1.1 div1は-1になります。


10

CAST()関数は、MySQLの「公式」データ型「INT」をサポートいません。サポートされている型のリストにはありません。MySQLでは、代わりに「SIGNED」(または「UNSIGNED」)を使用できます。

CAST(columnName AS SIGNED)

ただし、これはMySQL固有(標準化されていない)のようであるため、他のデータベースでは機能しない可能性があります。少なくともこの文書(第2非公式レビュードラフト)ISO / IEC 9075:1992、データベースのセクションに「SIGNED」/「UNSIGNED」がリストされていない4.4 Numbers

ただし、DECIMALはMySQLによって標準化およびサポートされているため、MySQL(テスト済み)およびその他のデータベースでは以下が機能するはずです。

CAST(columnName AS DECIMAL(0))

MySQLのドキュメントによると:

スケールが0の場合、DECIMAL値には小数点または小数部が含まれません。


3

番号が必ずしも.00で終わるとは限らない場合は、ROUND()もあります。ROUND(20.6)は21を与え、ROUND(20.4)は20を与えます。


3

あなたはこれを試すことができます:

SELECT columnName1, CAST(columnName2 AS  SIGNED ) FROM tableName 

1

試してみてください cast (columnName as unsigned)

unsignedは正の値のみです

負の値を含める場合はcast (columnName as signed)
符号(負の包含)と符号なし(符号のサイズの2倍、ただし負ではない)の差


1

1セント:スペースなしb / w CASTおよび(式)。つまり、CAST(columnName AS SIGNED)です。

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