首頁 >後端開發 >Golang >使用查詢中的 LEFT 連線掃描 SQLC 產生的程式碼中的 NULL 欄位時發生錯誤

使用查詢中的 LEFT 連線掃描 SQLC 產生的程式碼中的 NULL 欄位時發生錯誤

WBOY
WBOY轉載
2024-02-06 08:30:04459瀏覽

使用查询中的 LEFT 连接扫描 SQLC 生成的代码中的 NULL 列时出错

問題內容

我剛剛將 PostgreSQL 中的一個表格修改為 NULLABLE,如下所示:

CREATE TABLE a {
    a_name varchar NOT NULL
    b_id BIGINT <-- was previously NOT NULL with no problems 
}

CREATE TABLE b {
    id BIGSERIAL,
    b_name varchar NOT NULL
}

a.b_id > b.id 有外鍵約束。

我有許多查詢連接這些表並返回與此類似的 b.name:

-- name: List :many
SELECT
   a_name,
   b_name
FROM a
LEFT JOIN b ON b.id = a.bid <-- produces NULL columns in results

由於 LEFT JOIN,查詢 b_name 的回傳類型可以是 NULLa.b_id 中任何為 NULL 的行都會為 b_name 傳回 NULL。觀察。

實際上,查詢要複雜得多,在 WHERE 子句中發送多個可為空的參數,但直觀上我並不覺得這是問題所在。當然 SQLC 從查詢的 SELECT 部分配置其行結構...?

SQLC 正在產生與此類似的行結構:

type ListRow struct {
   AName string `json:"a_name"'
   BName string `json:"b_name"'
}

BName 應該可以為空(我在配置中使用各種 gobuffalo null 覆蓋),但不在結構中,因此會導致掃描錯誤:

"sql: Scan error on column index 1, name \"b_name\": converting NULL to string is unsupported"

我顯然遺漏了文件中明顯的內容,因為這必須是常規操作。迄今為止,我在使用 SQLC 進行相當複雜的 INNER JOIN 表查詢或具有可為 null 的列返回類型時沒有遇到任何問題。

不確定 SO 社群對 SQLC 有多活躍,感謝任何直覺或模糊的回饋。


正確答案


建議- 將查詢中的b_name 替換為coalesce(b_name, '** Attention **') 以查看可能發生的情況。

SELECT
   a_name,
   coalesce(b_name, '** Attention **')
FROM a LEFT JOIN b ON b.id = a.bid;

或或用 coalesce(b_name, '') 取代它(如果這是可以接受且有意義的)。

SELECT
   a_name,
   coalesce(b_name, '')
FROM a LEFT JOIN b ON b.id = a.bid;

或過濾 b_name 為 null 的結果

SELECT a_name, b_name
FROM a LEFT JOIN b ON b.id = a.bid
where b_name is not null;

以上是使用查詢中的 LEFT 連線掃描 SQLC 產生的程式碼中的 NULL 欄位時發生錯誤的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除