Выберите, если различное количество > 2?

Оператор == проверяет, указывают ли две ссылки на один и тот же объект или нет. .equals() проверьте фактическое содержимое строки (значение).

Обратите внимание, что метод .equals() принадлежит классу Object (суперкласс всех классов). Вам необходимо переопределить его в соответствии с вашим требованием к классу, но для String оно уже реализовано и проверяет, имеет ли две строки одно и то же значение.

  • Случай 1
    String s1 = "Stack Overflow";
    String s2 = "Stack Overflow";
    s1 == s2;      //true
    s1.equals(s2); //true
    
    Причина: строка литералы, созданные без нуля, хранятся в пуле строк в области перментонов кучи. Таким образом, оба s1 и s2 указывают на один и тот же объект в пуле.
  • Случай 2
    String s1 = new String("Stack Overflow");
    String s2 = new String("Stack Overflow");
    s1 == s2;      //false
    s1.equals(s2); //true
    
    Причина. Если вы создаете объект String с использованием ключевого слова new, ему выделяется отдельное пространство в куче.
0
задан Josh Miller 10 March 2019 в 12:12
поделиться

1 ответ

Добро пожаловать в 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'

Два соединения с индивидуальной ЗАПРОСОМ каждой отдельной части, и ЛЕВОЕ СОЕДИНЕНИЕ показывает, ЕСЛИ они также отмечены как комбинация записей. Как видно из неоднозначности в вашем вопросе, предоставление чуть более подробной информации о том, что вы хотите, может значительно помочь получить более точный ответ на ваши истинные потребности. Старайтесь не маскировать детали к контексту, но маскируйте сами данные примера, когда возникает проблема с более частными проблемами.

0
ответ дан DRapp 10 March 2019 в 12:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: