Перейти приложение, используя массив Postgres при выборе из таблицы Redshift - PullRequest
0 голосов
/ 04 мая 2018

В Интернете я видел много примеров использования массива при выборе значений из таблицы. Это запрос, который я запускал против Redshift select * from table where colID = ANY(array[1]) Этот запрос работает нормально, когда я запускал его с помощью SQL Workbench.

Я пытаюсь выполнить тот же запрос в приложении Go, используя https://github.com/lib/pq

db, err := sql.Open("postgres", url)
defer db.Close()

rows, err := db.Query(`select * from table where colID = ANY($1)`, pq.Array([]int{1}))
if nil != err {
        pqErr := err.(*pq.Error)
        fmt.Println(pqErr.Error())
} 

Ожидается, что приведенный выше код будет работать в соответствии с https://godoc.org/github.com/lib/pq#Array.

Но вывод - ошибка.

-----------------------------------------------
  error:  Assert
  code:      1000
  context:   IsA((Node*)arrayExpr->args->tail->data.ptr_value, Const) -
  query:     9574375
  location:  xen_execute.cpp:6200
  process:   padbmaster [pid=14680]
----------------------------------------------- 

как ошибка и строки nil

Однако приведенный ниже код работает

rows, err := db.Query(`select * from table where colID = ANY(array[1])`)

Кто-нибудь может объяснить, почему я получаю ошибку?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Redshift поддерживает ANY('{1,2,3}'::integer[]).
Причина, по которой db.Query('select * from table where colID = ANY($1)', pq.Array([]int{1,2,3})) не работает, заключается в том, что значение, возвращаемое pq.Array([]int{1,2,3}), равно {1,2,3}. Однако красное смещение ожидает, что оно будет '{1,2,3}'. Изменение запроса для включения единственного парантеза '' db.Query('select * from table where colID = ANY('$1')', pq.Array([]int{1,2,3})) вокруг массива не работает.

После нескольких попыток приведенный ниже код сработал!

v, _ := pq.Array([]int{1,2,3}).Value()
query := fmt.Sprintf(`select * from table where colID = any('%v'::integer[]);`, v)
rows, err := db.Query(query)
0 голосов
/ 04 мая 2018

Вышеуказанное должно работать с Postgres, но Redshift отличается и не имеет типа данных массива. Redshift поддерживает ЛЮБОЕ условие, но по-другому, параметр условия должен быть набором строк, а не массивом:

select true where 1=any(select 1 union select 2 union select 3);

вернет true и

select true where 4=any(select 1 union select 2 union select 3);

ничего бы не вернул.

Набор строк может быть жестко union, как указано выше, или результатом подзапроса, но не разделенный запятыми список или массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...