2011-02-25 29 views
0

我在嘗試刪除一行,其主鍵(列名=版本)例如是4.002000000000001。所以我給說的語句:刪除一行,其主鍵最接近X

DELETE FROM tbl WHERE version=4.002; 

現在,現在這不會工作,因爲世界上沒有排,有一個版本等於4.002,只等於4.002000000000001版本的行。請不要問爲什麼我不把版本保存爲4.002在數據庫中,因爲我試圖通過使列類型DECIMAL(5,3)來實現,但它仍然存儲從Java的雙重4.002000000000001。請不要問我爲什麼不說「...... WHERE version = 4.002000000000001;」因爲當我使用JDBC創建語句時,我無法控制java如何格式化它(即使使用DecimalFormat類)。

那麼有沒有辦法在SQLite3中舍入(floor函數)?那麼我可以說「刪除FLOOR(版本)等於4.002的行?

我是C++程序員(使用Java查詢SQL數據庫,請不要問爲什麼:P)誰不熟悉複雜SQL查詢,所以這會是正確什麼,我想做的事:?

DELETE FROM tbl WHERE ROUND(version, 0.5)=4.002; 
+4

天哪埃普西隆邊界所有版本的指定。映射到「double」的十進制PK。這是......非常充滿的。 – 2011-02-25 23:09:51

+0

我應該使用不同的Java數據類型嗎?浮動?也許是絃樂?我知道有一個SQL小數主鍵是不好的,但我正在更新一個大的現有項目和更好的框架內工作比重新設計和再次啓動。 – user593747 2011-02-25 23:14:03

+1

我同意@Kirk ..你應該退後一步,深呼吸一下,然後問自己爲什麼你想要一個非整數作爲主鍵。 – johusman 2011-02-25 23:14:51

回答

1

你能做到

DELETE FROM tbl WHERE version > 4.002 - 1e-4 AND version < 4.002 + 1e-4 

DELETE FROM tbl WHERE version > 4.0015 AND version < 4.0025 
5

而且,請不要問我爲什麼不說「......其中version = 4.002000000000001,」因爲現在我有過雙打了Java格式無法控制(即使使用DecimalFormat的類)

我贏了」噸。

但我會問你爲什麼使用double來存儲版本號。

機器浮點類型(基數2)不包含精確的十進制數。但版本號字符串是確切的。根據您的版本編號方案,將版本「數字」視爲以下之一會更好:

  • 縮放的整數;例如4.0024002除以1000。您可能不需要明確存儲縮放因子。
  • 元組或整數數組;例如4.002{4,2}。這允許版本號如4.003.005被表示爲{4,3,5}等等。
  • 受模式約束的字符串;例如4.002是一個匹配正則表達式"\d+\.\d\d\d"的字符串。這允許具有非數字部分的版本字符串。

選擇其中之一,您將不必擔心浮點類型在內存或數據庫中的根本不精確性質。


哦,對了DecimalFormat確實讓你控制的位數的小數點後當你格式的數字的方式。爲此,可以使用圖案或致電setMaximumFractionDigits

1
DELETE FROM tbl WHERE abs(version-4.002)<.0001 

,如果你想刪除0.0001