2014-10-02 151 views
0

我正在用libpq訪問PostgreSQL服務器。我的查詢看起來像這樣(「非洲」是任何字符串,column_2column_3都是有效的名稱和在psql提示符下執行時,這兩個查詢返回精):對PostgreSQL的查詢返回1列和0行的結果?

SELECT column_2 
    FROM mytable 
    WHERE column_1='Africa' AND column_2 IS NOT NULL 
    LIMIT 1; 

我得到1行1列的結果。然後,一段時間後,我改變column_2column_3和問題:

SELECT column_3 
    FROM mytable 
    WHERE column_1='Africa' AND column_3 IS NOT NULL 
    LIMIT 1; 

現在PQnfields()返回1不如預期,但PQntuples返回0! 所以現在由於某種原因,有0行,這當然打破data = PQgetvalue(resuls, 0, 0)

什麼是可能的錯誤來源,爲什麼它甚至會返回1列,如果沒有行?

+0

結果有1(或2,3,10 ...)列而沒有行的問題是什麼?這在postgres方面是完全有效的。 – 2014-10-02 15:05:21

+1

如果沒有與'column_1 ='Africa'和column_3 IS NOT NULL'相匹配的數據,則返回0行。查詢本身定義了返回行的結構(列的數量和類型)。這個結構不依賴於返回的行數。 – 2014-10-02 15:07:25

+0

@IgorRomanchenko是的,我基本上有一個錯字。我猜根據一些標準,PostgreSQL決定返回1列而不是0的查詢失敗? – user10607 2014-10-03 06:12:27

回答

2

此查詢有一列,但零行:

SELECT a as col1 
FROM generate_series(1,2) a 
WHERE false; 

儘管如此,它仍具有相同的結果類型,如果沒有足夠的WHERE FALSE。它只有零行。

這就是爲什麼我更喜歡考慮字段和記錄,而不是「列」和「行」。後者引導您像電子表格那樣思考它,但關係不是電子表格表格。它仍然有一個明確的結構,即使它是空的

因此,如果PQntuples返回零,請不要嘗試訪問不存在的結果。查詢返回零行是正常的和可接受的。它可以非常方便;例如,仍然可以使用PQftype來確定數據類型,如果返回的結果是,則返回結果。

是這樣工作的根本原因是PostgreSQL在幾個階段應答查詢(通過假設v3協議解析/綁定簡化/描述/執行執行,並跳過無關步驟):

  • 「查詢解析的OK 「
  • 」參數確定收到「
  • 」查詢結果結構會(colname的coltype,colname的coltype,...)「
  • 」查詢執行OK「
  • 」 查詢結果行的re ...「

所以,即使沒有任何結果行,我們已經知道它們的結構。

+0

很高興知道!這就是爲什麼它返回1列而不是0,結果有正確的格式(字段數),但不包含任何行(記錄)。 – user10607 2014-10-03 06:15:53