2013-01-15 28 views
6

例子查詢:如何在JDBC中使用MySQL子查詢?

SELECT country 
FROM data 
WHERE city LIKE 
(SELECT LEFT ('jakartada',7)); 

例JDBC:

String sql = " SELECT country FROM data WHERE city LIKE (SELECT LEFT ('?',7)) "; 
PreparedStatement ps = koneksi.prepareStatement(sql); 
ps.setString(1,  city ); 
ResultSet rs = ps.executeQuery(); 

爲什麼這不能正常工作?

回答

3

準備語句中沒有參數,但代碼嘗試設置參數。嘗試向語句添加一個參數。

String sql = " SELECT country FROM data WHERE city LIKE (SELECT LEFT (?,7)) "; 
PreparedStatement ps = koneksi.prepareStatement(sql); 
ps.setString(1,  city ); 
ResultSet rs = ps.executeQuery(); 

或嘗試取出語句設置參數:

String sql = " SELECT country FROM data WHERE city LIKE (SELECT LEFT ('jakartada',7)) "; 
PreparedStatement ps = koneksi.prepareStatement(sql); 
ResultSet rs = ps.executeQuery(); 
+0

OP使用'LIKE'所以我有點擔心拋出SQLException .. – Smit

+0

然後捕獲SQLException? – hd1

+0

@Kevin Bowersox:如何在語句中添加參數,你可以給出一個例子與該查詢? – reza

0

不要在您設置在運行值時,準備好的聲明中引述......否則,將它作爲僅輸入不ps的位置...從你的問號刪除單引號...

1

我相信你做得比它需要更難,同時你失去了一些東西。這是你想要做的嗎?

SELECT country FROM data WHERE city LIKE 'jakarta%' 

也就是說,你是否在尋找城市名稱以'jakarta'開頭的每一行的國家專欄?如果是這樣,不要忘記%標誌。如果不包括%標誌,然後

SELECT country FROM data WHERE city LIKE 'jakarta' 

SELECT country FROM data WHERE city = 'jakarta' 

的意思完全一樣的東西作爲對方,並在LIKE運營商是沒有意義的;你也可以使用=運營商。

所以,在我看來,你想要的MySQL查詢是

SELECT country FROM data WHERE city LIKE CONCAT(LEFT('jakartada',7),'%') 

添加%標誌。在這種情況下,你不需要子選擇。

就像你指出,你需要那麼Java代碼:

String sql = "SELECT country FROM data " . 
       "WHERE city LIKE CONCAT(LEFT(?,7),'%')"; 

PreparedStatement ps = koneksi.prepareStatement(sql); 
ps.setString(1,  city ); 
ResultSet rs = ps.executeQuery(); 
... process the rs records ... 
rs.close(); /* please don't forget to close your result sets */ 
+0

yeahh,你知道我的意思,但你的java代碼不能正常工作 – reza

+0

我使用這個查詢來爲我的程序預測何時發生輸入錯誤,所以系統會通過在右邊或左邊幾個字符來打破字符串然後根據數據庫中的數據進行匹配。 我試過這個查詢,並在MySQL中運行良好,所以我試圖在java中實現,但它不能很好地工作。 例如我有一個輸入「jakartada」,這是錯誤的輸入,然後系統將檢查左邊和右邊的字符串的一些字符,以找到正確的數據是「雅加達」。 – reza