Значения по умолчанию в столбце массива переменной длины типа Postgresql

Мой вопрос заключается в том, как установить значения по умолчанию для определенного индекса в столбце массива переменной длины. Я пытаюсь установить значение одной из позиций по умолчанию для строки «false».

Причина в том, что я хочу иметь предложение where в запросе для фильтрации элементов, где значение позиции «истинно» (я вручную устанавливаю для определенных значений значение «истина»), но без того, чтобы остальные мои данные по умолчанию были ложными на этом value мой запрос не получает никаких данных.

Если это сбивает с толку, дайте мне знать, и я постараюсь прояснить ситуацию. Заранее спасибо.


person parchambeau    schedule 08.01.2013    source источник
comment
Вы действительно должны предоставить определение таблицы и примеры данных для этого.   -  person Erwin Brandstetter    schedule 09.01.2013


Ответы (1)


Как правило, столбец по умолчанию предназначен для всего столбца — в вашем случае для всего массива.

Для этого вам нужно будет написать триггер. Но вам может и не понадобиться ничего из этого. Цитирую ваш вопрос:

... но без того, чтобы остальные мои данные по умолчанию были ложными для этого значения, мой запрос не извлекает никаких данных.

Вы, вероятно, можете избежать этого, если вы запросите с помощью:

(arr[5] = 'true') IS NOT TRUE

(включая все случаи, когда флаг не является «истинным», даже NULL) вместо:

arr[5] <> 'true'

И если вам нужен этот запрос быстро, вы можете поддержать его частичным индексом:

CREATE INDEX tbl_special_idx ON tbl (col1) -- potentially more columns
WHERE (arr[5] = 'true') IS NOT TRUE;

Важной частью является пункт WHERE. Вы можете использовать столбцы вместо col1, которые могут охватывать весь запрос (особенно в версии 9.2) или с дополнительными условиями в вашем запросе...

person Erwin Brandstetter    schedule 09.01.2013
comment
Почему бы просто не arr[5] IS NOT TRUE или arr[5] IS DISTINCT FROM 'true' ? - person Ihor Romanchenko; 09.01.2013
comment
Ссылка на документы: postgresql.org/docs/current/static/functions -comparison.html - person Ihor Romanchenko; 09.01.2013
comment
@IgorRomanchenko: Без особых причин. Выражения (arr[5] = 'true') IS NOT TRUE и arr[5] IS DISTINCT FROM 'true' эквивалентны. - person Erwin Brandstetter; 09.01.2013