2015-07-02 1 views
-1

У меня есть таблицы SQL, какSQL тест, если ARRAY содержит целое число

CREATE TABLE Test (ContentArray INTEGER ARRAY)`. 
I can insert an column with `INSERT INTO Test (ContentArray) VALUES (ARRAY[1,2,3,4]) 

Но я не знаю, как получить все столбцы, где ContentArray содержит целое число 3.

Например:

INSERT INTO Test (ContentArray) VALUES (ARRAY[1,2]) 

INSERT INTO Test (ContentArray) VALUES (ARRAY[3,4]) 

INSERT INTO Test (ContentArray) VALUES (ARRAY[4,5]) 

INSERT INTO Test (ContentArray) VALUES (ARRAY[5,6]) 

SELECT ContentArray FROM Test WHERE /* ContentArray contains 5 and 6 */ 

должен вернуть ARRAY[5,6].

+0

Какой RDMBS вы используете? –

+0

Не знаете, какую СУБД вы используете, но почти всегда плохая идея использовать типы данных массива для полей в реляционной базе данных. Лучший выбор - сохранить эти значения в качестве дочерних элементов главной таблицы, тогда ваш запрос станет простым. –

+0

Я использую HSQLDB – mohe2015

ответ

1

Учитывая СУБД и некоторые быстро исследования, это выглядит как SQL2008 поддерживает любое ключевое слово, чтобы этот тип запроса для типов данных массива:

SELECT * FROM Test WHERE 3 = ANY (ContentArray); 

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

+1

HSQLDB еще не поддерживает '3 = ANY (ContentArray)'. Он поддерживает '3 IN (UNNEST (ContentArray))', а также 'POSITION_ARRAY (3 IN ContentArray)> 0', который работает лучше – fredt

+0

@fredt Спасибо! Я буду проверять, что быстрее (и лучше для меня). – mohe2015

+0

'SELECT * FROM Test WHERE POSITION_ARRAY (3 IN ContentArray)> 0' (617 мс) быстрее, чем 'SELECT * FROM Test WHERE 3 IN (UNNEST (ContentArray))' (2118 мс). (1,220,608 строк, полученных в целом: 4 882 432). Это достаточно быстро для меня. :) – mohe2015

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

  • Нет связанных вопросов^_^