2013-06-12 86 views
2

我使用LIKE來針對float字段返回匹配的數字結果。似乎一旦小數點左邊的位數超過4位,就不會返回與小數點右邊的搜索項匹配的值。下面是說明這種情況的例子:針對float字段的SQL服務器「like」產生不一致的結果

CREATE TABLE number_like_test (
    num [FLOAT] NULL 
) 

INSERT INTO number_like_test (num) VALUES (1234.56) 
INSERT INTO number_like_test (num) VALUES (3457.68) 
INSERT INTO number_like_test (num) VALUES (13457.68) 
INSERT INTO number_like_test (num) VALUES (1234.76) 
INSERT INTO number_like_test (num) VALUES (23456.78) 

SELECT num FROM number_like_test 
WHERE num LIKE '%68%' 

該查詢並沒有隨着12357.68值返回的記錄,但它確實與3457.68的返回值的記錄。用78而不是68來運行查詢不返回23456.78記錄,但使用76返回1234.76記錄。

所以要回答這個問題:爲什麼有更大的數字會導致這些結果發生變化?我如何更改我的查詢以獲得預期的結果?

+6

**不要對數字使用'LIKE' **這是用於字符串字符串比較。 – JNK

+0

@JNK,如果數值被轉換爲字符串呢? – rosscj2533

+1

你可以這樣做我猜,但爲什麼你在地球上? – JNK

回答

4

like運算符需要一個字符串作爲左側值。根據該文件,從floatvarchar轉換可以使用several styles

Value   Output 
0 (default) A maximum of 6 digits. Use in scientific notation, when appropriate. 
1    Always 8 digits. Always use in scientific notation. 
2    Always 16 digits. Always use in scientific notation. 

默認樣式將正常工作的六位數字在3457.68,而不是爲七位數的13457.68。要使用16位而不是6位,可以使用convert並指定樣式2.樣式2表示類似3.457680000000000e+003的數字。但是這對前兩位數字不起作用,並且您可以免費獲得意想不到的+003指數。

最好的方法可能是從floatdecimal的轉換。該轉換允許您指定比例和精度。使用檯秤20和精度10,浮子被表示爲3457.6800000000

where convert(decimal(20,10), num) like '%68%' 
+0

好的答案,即使它與小數轉換一起工作,這填補了爲什麼它不起作用的問題,由於數字的數量。外部轉換爲varchar真的需要嗎? – rosscj2533

+0

好點,它看起來像外部轉換不是必需的。從「decimal」到「varchar」的隱式轉換不會丟失數字。 – Andomar

1

這可能是因爲一個FLOAT數據類型代表一個floating point number這是一個近似的數字,不應該依靠精確的比較。

如果你需要做的,包括你需要要麼將其存儲在十進制數據類型(這將持有的確切數字),或使用類似the STR() function

2

其轉換爲varchar浮動值的搜索當你與LIKE比較數字是隱式轉換爲字符串,然後匹配
這裏的問題是,浮點數不準確的,當它被轉換,你可以得到
13457.679999999999999代替13457.68

所以要狂熱這明確地f在適當的格式ORMAT數(不知道如何做到這一點在SQL Server中,但它會是這樣的),以字符串轉換舍入你的價值觀

SELECT num FROM number_like_test 
WHERE Format("0.##",num) LIKE '%68%' 
2

CONVERTCAST都具有相同的行爲。

SELECT cast(num as nvarchar(50)) as s 
FROM number_like_test 

或者

SELECT convert(nvarchar(50), num) as s 
FROM number_like_test 

提供結果:

1234.56 
3457.68 
13457.7 
1234.76 
23456.8 

你將不得不使用STR功能和格式正確參數,試圖讓你的結果。例如,

SELECT STR(num, 10, 2) as s 
FROM number_like_test 

給出:

1234.56 
    3457.68 
    13457.68 
    1234.76 
    23456.78 
+0

但是在where子句中使用類似的值(強制轉換或轉換)仍然會給出錯誤的結果。由於float數據類型的精確性,我需要將其轉換爲十進制(如NenadZivkovic註釋)。 – rosscj2533

+0

您的編輯在where子句中正常工作。謝謝。 – rosscj2533

+0

@ rosscj2533 - 是的,這就是我想說的。將其轉換爲十進制可能是正確的選擇,但也可以使用帶有正確格式參數的STR。 – ken

2

漂亮很好的解決了,但你只需要像其他答案建議投一次,而不是兩次,像取字符串轉換的護理:

SELECT * 
FROM number_like_test 
WHERE CAST(num AS DECIMAL(12,6)) LIKE '%68%' 

這裏是一個SQL搗鼓出的舍入行爲:SQL Fiddle