Оператор ==
проверяет, указывают ли две ссылки на один и тот же объект или нет. .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
, ему выделяется отдельное пространство в куче. Добро пожаловать в S / O. Как правило, вы хотите предоставить более реалистичные образцы таблиц структур и данных, чтобы представить их как минимум критически важные для вашего вопроса. если когда-либо частные данные, составьте, но держите их в точном контексте.
При этом, я не думаю, что у вас на самом деле есть стол яблок, груш и яблок & amp; груши, но я буду подыгрывать.
Я предполагаю (пример), что у вас есть таблица людей и другая таблица вещей, с которой они связаны в дочерней таблице. Я бы сделал ПЕРВЫЙ на человека, для тех, кто ДЕЙСТВИТЕЛЬНО связан с записью «яблок и груш», затем сделал ЛЕВЫЙ ПОДКЛЮЧЕНИЕ к тому же дочернему столу один раз для яблок, другой для груш. Вы можете определить, что вы хотите сделать с результатами (например, удалить из отдельных яблок, записи груш ребенка).
Select
p.LastName,
p.FirstName,
case when justApples.PersonID IS NULL
then 'No' else 'Yes' end as AlsoHasApples,
case when justPears.PersonID IS NULL
then 'No' else 'Yes' end as AlsoHasPears
from
Person p
JOIN Fruits f
on p.PersonID = f.personID
AND f.Description = 'Apples & Pears'
LEFT JOIN Fruits justApples
on p.PersonID = justApples.PersonID
AND f.Description = 'Apples'
LEFT JOIN Fruits justPears
on p.PersonID = justPears.PersonID
AND f.Description = 'Pears'
Так как первый «(внутренний) JOIN» явно ищет те, которые помечены как яблоки & amp; рекорд груши, который минимизирует список только тем предварительно квалифицированным людям.
Затем, два «LEFT-JOIN» явно ищут ДРУГИЕ индивидуализированные «Яблоки» и «Груши» соответственно.
При тестировании IS NULL покажет, есть ли у человека (или нет через NULL) этот предмет.
Если вы ТОЛЬКО ХОТИТЕ вернуть те, которые являются яблоками & amp; Груши И имеют один или оба других отдельных элемента, вы можете добавить в конце предложение WHERE, например
WHERE
justApples.PersonID IS NOT NULL
OR justPears.PersonID IS NOT NULL
. Инверсией будет предварительная квалификация justApples и justPears, а НЕ помеченная как связанная с Яблоки и Груши, такие как ТРЕБУЮЩИЕ СОЕДИНЕНИЯ к яблокам и грушам индивидуально и ЛЕВЫЕ СОЕДИНЕНИЯ с записью комбинации
Select
p.LastName,
p.FirstName,
case when f.PersonID IS NULL
then 'No' else 'Yes' end as IsAssociatedWithApplesAndPearsRecord
from
Person p
JOIN Fruits justApples
on p.PersonID = justApples.PersonID
AND f.Description = 'Apples'
JOIN Fruits justPears
on p.PersonID = justPears.PersonID
AND f.Description = 'Pears'
LEFT JOIN Fruits f
on p.PersonID = f.personID
AND f.Description = 'Apples & Pears'
Два соединения с индивидуальной ЗАПРОСОМ каждой отдельной части, и ЛЕВОЕ СОЕДИНЕНИЕ показывает, ЕСЛИ они также отмечены как комбинация записей. Как видно из неоднозначности в вашем вопросе, предоставление чуть более подробной информации о том, что вы хотите, может значительно помочь получить более точный ответ на ваши истинные потребности. Старайтесь не маскировать детали к контексту, но маскируйте сами данные примера, когда возникает проблема с более частными проблемами.