2016-04-20 2 views
0

у меня есть таблица, содержащая студентов детали, а столбец в нем будет содержащий любимые цвета студентов в массиве JSonПодготовка где положение на столбцах типа JSON в PostgreSQL

----------------------------------------------------- 
id name        colors 
----------------------------------------------------- 
1 John        {'red','blue'} 
2 Cena        {'red'} 
3 Templeman       {'orange'} 
4 Kristy        {'pink','red'} 
------------------------------------------------------ 

теперь я хочу, чтобы перечислить все студенты, имеющие один из этих любимых цветов

select all students whose colors IN (red,pink) 

поэтому список я ожидаю

1 John        {'red','blue'} 
2 Cena        {'red'} 
4 Kristy        {'pink','red'} 

есть способ сделать это? Я попытался найти индивидуальный цвет с (color=red OR color = pink), но это делает запрос длинным и вызывает задержку, когда список сопоставлений огромен, я думаю, что IN, как цвет IN (красный, розовый), будет лучше, чем это, можно ли искать в столбце json array?

+0

Используйте оператор '&&'. Как в этом [вопрос] (http://stackoverflow.com/questions/1647385/postgres-comparing-two-arrays): 'SELECT * FROM students where colors && '{" red "}';' –

+0

, который не работал , но другой, просто добавил мой собственный ответ – CodeRows

+0

О, я вижу. Ваши «цвета» описываются как текстовое поле. Я тестировал запрос именно в массиве: 'CREATE TABLE students (идентификационный серийный первичный ключ, имя varchar, цвет varchar []); INSERT INTO студентов (название, цвета) ЗНАЧЕНИЯ \t ('Джон', '{ "красный", "синий"}'), \t ('Cena', '{ "красный"}'), \t (» Templeman ',' {"orange"} '), \t (' Kristy ',' {"pink", "red"} '); SELECT * FROM students where colors && '{"red"}'; ' –

ответ

0

Я нашел наконец

SELECT * FROM students where colors::jsonb ?| '{"red","pink"}' ; 

так это извлекает все записи, имеющие любую из цветов в их любимой колонке

? | для любого одного совпадающего элемента в массиве и? & для всех элементов

Смежные вопросы