|
|
|
присваивание значения полю элемента массива записей
|
|||
|---|---|---|---|
|
#18+
Есть array элементов типа record. Но в этот массив записей почему-то нельзя селектить, и в поля элемента этого массива почему-то нельзя присваивать значение. Что за беда? Кто нибудь может ткнуть носом в документацию, по которой в 9.3 это должно не работать: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. И есть ли костыльные обходы поэлегантнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2015, 14:35 |
|
||
|
присваивание значения полю элемента массива записей
|
|||
|---|---|---|---|
|
#18+
NashevЕсть array элементов типа record. Но в этот массив записей почему-то нельзя селектить, и в поля элемента этого массива почему-то нельзя присваивать значение. Что за беда? Кто нибудь может ткнуть носом в документацию, по которой в 9.3 это должно не работать: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. И есть ли костыльные обходы поэлегантнее? попробуйте (r[1]).my_field := 'test' -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2015, 14:56 |
|
||
|
присваивание значения полю элемента массива записей
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2015, 15:02 |
|
||
|
присваивание значения полю элемента массива записей
|
|||
|---|---|---|---|
|
#18+
Nashev, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2015, 15:09 |
|
||
|
присваивание значения полю элемента массива записей
|
|||
|---|---|---|---|
|
#18+
Nashev, P.S. больно не пинайте, может задачу неправильно понял... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2015, 15:10 |
|
||
|
присваивание значения полю элемента массива записей
|
|||
|---|---|---|---|
|
#18+
Нагуглил, что первый мой вопрос обсуждался в http://postgresql.nabble.com/SELECT-INTO-array-i-with-PL-pgSQL-td3374982.html, и от тыкания в документацию тема ушла на советы просто так не делать, а делать иначе, не поэлементно, а через запрос массива целиком, через array() и array_agg(). Круто, полезно, но искомого ответа не даёт. Попутно показали синтаксис вида Код: sql 1. который я тоже в документации обнаружить затрудняюсь. К тому же, при попытке таким макаром получить в переменную всю строку, а не одно поле, получаю ошибку вида ERROR: query "SELECT * from my_table where id = 1" returned 7 columns ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2015, 15:15 |
|
||
|
присваивание значения полю элемента массива записей
|
|||
|---|---|---|---|
|
#18+
Nashev, select array_agg(таблица) into переменная_массив from таблица; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2015, 15:16 |
|
||
|
присваивание значения полю элемента массива записей
|
|||
|---|---|---|---|
|
#18+
В http://stackoverflow.com/questions/32702124/postgresql-slow-array-assignment пишут, что запись элемента в массив переписывает массив целиком (избавляются от этого, кажись, в 9.5 - http://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=1dc5ebc9077ab742). Кажись, присваивание полю элемента массива записей реализовывали бы ровно через такой же костыльный обход, что привёл я, но он хоть был бы не явный. Видимо, просто поленились, решив что это никому не надо. Но где про это в документации?? А ещё в http://blog.heapanalytics.com/dont-iterate-over-a-postgres-array-with-a-loop/ написано, что даже поиск элемента массива по индексу ближе к концу диапазона приводит к чтению практически всего массива в поисках места, где хранится элемент с таким индексом. И все везде советуют вместо массивов временные таблицы, а цикл по элементам массива делать не через индексы, а через разбор его в таблицу с помощью unnest и обращения вида Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2015, 15:40 |
|
||
|
присваивание значения полю элемента массива записей
|
|||
|---|---|---|---|
|
#18+
NashevА ещё в http://blog.heapanalytics.com/dont-iterate-over-a-postgres-array-with-a-loop/ написано, что даже поиск элемента массива по индексу ближе к концу диапазона приводит к чтению практически всего массива в поисках места, где хранится элемент с таким индексом.Для типов фиксированной длины массив организован традиционно с индексной адресацией, а не связанным списком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2015, 16:04 |
|
||
|
присваивание значения полю элемента массива записей
|
|||
|---|---|---|---|
|
#18+
NashevВ http://stackoverflow.com/questions/32702124/postgresql-slow-array-assignment пишут, что запись элемента в массив переписывает массив целиком (избавляются от этого, кажись, в 9.5 - http://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=1dc5ebc9077ab742). Кажись, присваивание полю элемента массива записей реализовывали бы ровно через такой же костыльный обход, что привёл я, но он хоть был бы не явный. Видимо, просто поленились, решив что это никому не надо. Но где про это в документации?? А ещё в http://blog.heapanalytics.com/dont-iterate-over-a-postgres-array-with-a-loop/ написано, что даже поиск элемента массива по индексу ближе к концу диапазона приводит к чтению практически всего массива в поисках места, где хранится элемент с таким индексом. И все везде советуют вместо массивов временные таблицы, а цикл по элементам массива делать не через индексы, а через разбор его в таблицу с помощью unnest и обращения вида Код: sql 1. 2. 3. Такое обращение к элементам массива лучше или хуже из RTFM ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2015, 16:06 |
|
||
|
присваивание значения полю элемента массива записей
|
|||
|---|---|---|---|
|
#18+
ursidoNashev<> Код: sql 1. 2. 3. Такое обращение к элементам массива лучше или хуже из RTFM ? безусловно лучше -- если вам надо работать с учетом измерения. unnest разбивает массив на конечные элементы , т.е. на количесвто измерений ему плевать. В лупе по массиву вы можете указать [ SLICE number ]. а работать с присвоением элементу--компаунду надо так -- присваиваете компунд из массива переменной компаундного типа. меняете ей поля , присваиваете элементу массива значение из вашей переменной--компаунда. За количеством лишних присвоений по значению следить не приходится -- ешьте, что дают. Или используйте более другие процедурные ленгвичи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2015, 16:35 |
|
||
|
|

start [/forum/topic.php?fid=53&fpage=101&tid=1997624]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
43ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
27ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 300ms |

| 0 / 0 |
