簡體   English   中英

JDBC查詢拋出語法錯誤

[英]JDBC query throwing syntax error

基本上,這應該做的是運行一個查詢,從一列中讀取所有值,然后根據這些值運行其他一些查詢。 它將值轉換為整數的SQL數組,並將其作為參數傳遞給其他查詢的語句,但是當它們執行時,它將引發“在“ $ 1”或附近的語法錯誤”位置:87”

查詢示例:

"SELECT foo.id, bar.* "
+ "FROM foo, bar y "
+ "WHERE foo.baz = bar.baz and foo.id IN ? "
+ "GROUP BY foo.id";

和參數設置位(結果是列數據的數組列表):

    Integer[] data = result.toArray(new Integer[result.size()]);
    Array array = connection.createArrayOf("INTEGER", data);

    statement.clearParameters();
    statement.setArray(1, array);

(代碼是通用的,因為這是用於家庭作業)

IN運算符要求使用放在括號之間的表達式列表: in (1,2,3) 一個? 占位符僅可用於單個標量值(數字,字符串)。

如果要將ID列表作為數組傳遞,則需要更改SQL,以便占位符“接受”數組:

SELECT foo.id, bar.*
FROM foo
  JOIN bar y ON foo.baz = bar.baz
WHERE and foo.id = ANY (?) 
GROUP BY foo.id

請注意,我還將WHERE子句中的舊式隱式JOIN更改為現代的顯式JOIN (但這與您的問題無關緊要)。

使用上述語法,您可以傳遞帶有ID列表的數組。

您將得到的下一個問題是Postgres中"INTEGER"不是有效的數據類型。 類型名稱按“原樣”傳遞,而數據類型在Postgres中使用小寫字母。 因此,您需要使用:

Array array = connection.createArrayOf("integer", data);

您為什么不一口氣做到這一點?

SELECT foo.id, bar.*
FROM foo
  JOIN bar y ON foo.baz = bar.baz
WHERE and foo.id IN (SELECT some_column FROM ...) --<< this is your "first query"
GROUP BY foo.id

這幾乎總是比運行兩個單獨的語句更好。


無關:

group by foo.id似乎是不必要的,因為您不使用任何聚合函數。 除非foo.idfoo表的主鍵,否則它將無法正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM