2011-12-20 37 views
3

當我寫這篇文章的查詢MySQL的地方精確匹配

SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id = 260; 

回報

title   city 
--------------- ------ 
Butterfly world Mohali 

,當我寫

SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id = '260abcxyz'; 

回報

title   city 
--------------- ------ 
Butterfly world Mohali 

看到第二個是錯的。我只想得到價值如果ID確切匹配...如何解決這個問題。謝謝你的幫助。

+0

您能顯示完整的行嗎?和表格定義。 – Nishant 2011-12-20 04:44:33

回答

2

您可以在id轉換爲字符串,因此比較將準確完成。你可以使用LIKE引起的隱式轉換

SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id LIKE '260abcxyz'; 

或替代,可以執行轉換明確

SELECT cd.title, cd.city FROM coupon_detail cd WHERE CAST(cd.id AS CHAR) = '260abcxyz'; 

但是,如果所有的ID是整數,它可能更合適之前檢查這些值您嘗試查詢數據庫。 (如果您要查詢的ID不是數字,則無法進行匹配。)

+0

@MadanSapkota很高興我能幫忙:) – 2011-12-22 13:37:16

2

這是因爲在MySQL的類型轉換的發生。我的SQL把「260abcxyz」在您的查詢的整數,據我所知,因爲第一個字符是數的MySql它轉換爲數字,它只有260變,這就是爲什麼你所得到的結果。如果你先寫'abcxyz260'這樣的字符,它會成功地進行比較。

更多的解釋可在這裏:Type Conversion in MySql

作爲一個解決方案:你應該只有數字比較過去了,不串和數字的組合照顧。

2

好吧,如果idINT你不應該使用引號。 MySQL的工作方式是,如果使用字符串來比較INT,則它僅使用來自start的有效初始整數。

看到這一點:

mysql> desc coupon_detail; 
+-------+--------------+------+-----+---------+-------+ 
| Field | Type   | Null | Key | Default | Extra | 
+-------+--------------+------+-----+---------+-------+ 
| id | int(11)  | YES |  | NULL |  | 
| title | varchar(100) | YES |  | NULL |  | 
| city | varchar(100) | YES |  | NULL |  | 
+-------+--------------+------+-----+---------+-------+ 
3 rows in set (0.04 sec) 

mysql> SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id = 'ff260'; 
Empty set, 1 warning (0.00 sec) 

mysql> SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id = '260ff'; 
+-----------------+--------+ 
| title   | city | 
+-----------------+--------+ 
| Butterfly world | Mohali | 
+-----------------+--------+ 
1 row in set, 1 warning (0.00 sec) 

mysql> SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id = 260; 
+-----------------+--------+ 
| title   | city | 
+-----------------+--------+ 
| Butterfly world | Mohali | 
+-----------------+--------+ 
1 row in set (0.00 sec) 

mysql> SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id = 26011; 
Empty set (0.00 sec) 

的想法是不要混淆數字和aphabets來比較INT列。如果您不得不考慮

  • 將ID列轉換爲VARCHAR。在這種情況下,自動增量可能會消失。
  • 有應用邏輯只查詢有NUMERICS字符串。
0

使用像代替=因爲如果字符串太長比完全比不會以這種方式工作
SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id LIKE '260abcxyz';