7

左結合で結合された 3 つのテーブルがあります。コードは次のとおりです。

SELECT
(LEAST(`a`.`price, `b`.`price`) - `c`.`price`) AS `diff`
...
ORDER BY `diff` DESC

問題: c. priceLEAST より大きいため、減算は負になり、BIGINT UNSIGNED 値が範囲外です。このばかげたエラーをスローしないようにするにはどうすればよいですか?
これは結果データです。テーブル内の実際のデータを変更しているわけではありません。なぜ、これを正常に行うことができないのでしょうか? CAST(LEAST(...) AS SIGNED)LEAST 内の両方の列を署名済みとしてキャストしようとしましたが、どちらも機能しませんでした。

4

2 に答える 2

7

LEAST と減算の前の各数値を SIGNED としてキャストする

SELECT
(LEAST(CAST(`a`.`price` AS SIGNED), CAST(`b`.`price` AS SIGNED)) - CAST(`c`.`price` AS SIGNED)) AS `diff`
...
ORDER BY `diff` DESC
于 2012-11-08T11:49:23.317 に答える
1

NO_UNSIGNED_SUBTRACTION演算子を確認することをお勧めします: http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html#sqlmode_no_unsigned_subtraction

ただし、使用にはリスクがあります: http://datacharmer.blogspot.fi/2006/11/hidden-risks-of-sql-mode.html

于 2012-11-08T11:48:14.523 に答える