2016-04-15 3 views
2

Я выбираю различные значения из таблиц через JDBC-коннектор Java, и кажется, что значение NULL (если оно есть) всегда является первой строкой в ​​ResultSet.Функция ОТПРАВЛЕНИЯ Postgres всегда возвращает null в качестве первого элемента?

Мне нужно удалить этот NULL из списка, где я загружаю этот ResultSet. Логика смотрит только на первый элемент, и если она равна нулю, то игнорирует ее.

Я не использую ORDER BY в запросе, могу ли я до сих пор доверять этой логике? Об этом я не могу найти в документации Postgres.

+1

Покажите нам определения таблиц и запрос. Но в целом, если вы не используете 'order by', вы можете ** не ** полагаться на любой порядок возвращаемых данных. –

ответ

1

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

with t(n) as (values (1),(2),(1),(3),(null),(8),(0)) 
select distinct * from t 

Однако крест, соединяющий таблицу с модифицированной версией самого себя, приносит два NULL в верхнюю часть, но случайные NULL рассеиваются по набору результатов. Таким образом, похоже, что нет четкой логики, объединяющей все значения NULL в верхней части.

with t(n) as (values (1),(2),(1),(3),(null),(8),(0)) 
select distinct * from t 
cross join (select n+3 from t) t2 
2

Вы можете добавить чек на NOT NULL. Просто нравится

select distinct columnName 
from Tablename  
where columnName IS NOT NULL 

Кроме того, если вы не предоставляют ORDER BY п то тогда порядок, в котором вы собираетесь получить результат не гарантирован, поэтому вы не можете полагаться на него. Так что лучше и рекомендовал предоставить ОКВЕК ВУ, если вы хотите, чтобы ваш вывод результата в конкретной продукции (т.е. по возрастанию или по убыванию)

Если вы ищете reference Postgresql document, то он говорит:

Если ORDER BY не задан, строки возвращаются в любом порядке, который система считает самой быстрой для производства.

+0

Я работаю над старым оборудованием, и я хотел получить доступ к этим данным с минимальными затратами; нет ЗАКАЗА, нет условия WHERE. NULL в первой строке также избавил меня от итерации. Или нет, как я вижу сейчас. –

+2

@AdamHorvath: сокращение количества возвращаемых строк будет менее дорогостоящим, чем возврат ненужных данных. Тем более, что 'where' оценивается _before_' distinct', поэтому, сокращая строки, 'differ' имеет меньше работы. Стоимость выбора с или без этого предложения 'where' будет по существу одинаковой. Если у вас есть индекс в столбце, он будет даже _improve_ производительности. –