Оператор ==
проверяет, указывают ли две ссылки на один и тот же объект или нет. .equals()
проверьте фактическое содержимое строки (значение).
Обратите внимание, что метод .equals()
принадлежит классу Object
(суперкласс всех классов). Вам необходимо переопределить его в соответствии с вашим требованием к классу, но для String оно уже реализовано и проверяет, имеет ли две строки одно и то же значение.
String s1 = "Stack Overflow";
String s2 = "Stack Overflow";
s1 == s2; //true
s1.equals(s2); //true
Причина: строка литералы, созданные без нуля, хранятся в пуле строк в области перментонов кучи. Таким образом, оба s1 и s2 указывают на один и тот же объект в пуле. String s1 = new String("Stack Overflow");
String s2 = new String("Stack Overflow");
s1 == s2; //false
s1.equals(s2); //true
Причина. Если вы создаете объект String с использованием ключевого слова new
, ему выделяется отдельное пространство в куче. Вы можете попробовать следующее, если это работает для вас. Я также добавил ссылку на скрипту SQL
http://sqlfiddle.com/#!4/d162a4/10
select (case when row_id=1 then industry else ' ' end) industry
,country
,price
from (select industry,country
,price
,row_number() over(partition by industry order by rownum) row_id
from prices
) tmp
Вы действительно хотите сделать это на уровне представления. Таблицы SQL и наборы результатов представляют неупорядоченных наборов. Единственное исключение - когда конечный результат имеет order by
. Поэтому вам нужно быть очень осторожным, чтобы защититься от перестановок.
Ваши данные сначала имеют самую низкую цену. Поэтому в MySQL 8+ или почти в любой другой базе данных вы можете сделать:
select (case when row_number() over (partition by industry order by price, country) = 1
then industry
end) as industry,
country, price
from t
order by industry, price, country;
Я не могу сказать, является ли пробел во втором столбце преднамеренным, но вы можете включить его.
Позвольте мне повторить: внешний order by
имеет решающее значение для обеспечения того, чтобы данные были такими, как вы хотите. Без результата оператор say может выглядеть «правильно», но может не сработать при следующем запуске запроса.
В более ранних версиях MySQL вы можете делать то же самое, но это выглядит по-другому. Вы не пометили версию, поэтому я возьму более свежую версию.