Как я могу отобразить значение поля в MySQL, только если другое значение в том же поле не существует?IF / ELSEIF или CASE? - PullRequest
0 голосов
/ 11 июня 2019

Я пишу отчет, чтобы показать просроченные счета, и я хочу, чтобы он включал платежный адрес компании.Данные имеют несколько типов адресов в качестве возможностей (счет-фактура, бизнес-адрес, роялти-фактура и т. Д.).Все они сопоставлены с идентификатором (address_name_type_id ... 1 - «Бизнес-адрес», 4 - «Билл»).

У каждой организации есть бизнес-адрес. Но я хочу, чтобы этот адрес отображался только в том случае, если другиене существует. Этот код правильно показывает мне адреса, которые я в первую очередь хочу (где идентификатор 4, 5 или 6). Но он загружается пустым для тех, которые имеют только «бизнес-адрес» (потому что это не 4,5 или 6).

ПРИМЕЧАНИЕ: это всего лишь фрагмент соответствующего кода. Весь отчет имеет большой объем, но у меня он настроен на отображение только одной строки на один счет-фактуру. В этом случае organization_id =6303 вообще не отображается, поскольку у него есть только служебный адрес.

    SELECT
    o.name AS 'Organization',
    org_add.address_name_type_id AS "Address Type|display_name:AddressNameType",
    ad.street1 AS "Address 1",
    ad.street2 AS "Address 2",
    ad.city AS "City",
    ad.state_id AS  "State|display_name:State",
    ad.zip_code AS "Zip Code",
    ad.country_id AS "Country|display_name:Country"

    FROM
    organization o
    LEFT JOIN
        (SELECT o2a.organization_id, o2a.address_name, o2a.address_name_type_id, o2a.address_id, o2a.active 
           FROM organization2address o2a 
           WHERE o2a.address_name_type_id IN (4,5,6)) AS org_add ON org_add.organization_id = o.organization_id 
    LEFT JOIN
    address ad ON org_add.address_id = ad.address_id

WHERE o.organization_id IN (6654, 6082, 6303)
AND
org_add.active = 1

Все, что я пытался исправить, в итоге возвращает ТОЛЬКО рабочий адрес, поскольку в каждом счете есть один из них.

Как я могу сказать, чтобы ТОЛЬКО возвращался бизнес-адрес, ЕСЛИ НЕ существует IN_ address_type_type_id (4, 5, 6)? Этот оператор CASE не работает - он только возвращает адрес с address_name_type_id из 1.

SELECT
   o.name AS 'Organization',
     (CASE WHEN o2a.address_name_type_id = 4 THEN 4 
           WHEN o2a.address_name_type_id = 5 THEN 5 
           WHEN o2a.address_name_type_id = 6 THEN 6 
            ELSE 1
             END)  AS "Address Type 2|display_name:AddressNameType",
   ad.street1 AS "Address 1",
   ad.street2 AS "Address 2",
   ad.city AS "City",
   ad.state_id AS  "State|display_name:State",
   ad.zip_code AS "Zip Code",
   ad.country_id AS "Country|display_name:Country"

    FROM
    organization o
    LEFT JOIN
    organization2address o2a ON o2a.organization_id = o.organization_id 
    LEFT JOIN
    address ad ON o2a.address_id = ad.address_id

WHERE o.organization_id IN (6654, 6082, 6303)
AND
o2a.active = 1
group by o.name

Возможно ли это сделать?Я обдумываю это?

1 Ответ

0 голосов
/ 11 июня 2019

Добро пожаловать в переполнение стека.

Если бы я был в вашей ситуации, учитывая, что служебный адрес является самым низким идентификатором, я бы сделал MAX () для значений address_name_type_id, привязанных к организации.

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

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

SELECT
   o.name AS 'Organization',
   org_add.address_name_type_id AS "Address Type|display_name:AddressNameType",
   ad.street1 AS "Address 1",
   ad.street2 AS "Address 2",
   ad.city AS "City",
   ad.state_id AS  "State|display_name:State",
   ad.zip_code AS "Zip Code",
   ad.country_id AS "Country|display_name:Country"
FROM
   organization o
WHERE
   o.id IN ( SELECT organization_id FROM org_add WHERE MAX( address_name_type_id ) == 1 )
UNION
SELECT
   o.name AS 'Organization',
   org_add.address_name_type_id AS "Address Type|display_name:AddressNameType",
   alt_ad.street1 AS "Address 1",
   alt_ad.street2 AS "Address 2",
   alt_ad.city AS "City",
   alt_ad.state_id AS  "State|display_name:State",
   alt_ad.zip_code AS "Zip Code",
   alt_ad.country_id AS "Country|display_name:Country"
FROM
   organization o
WHERE
   o.id IN ( SELECT organization_id FROM org_add WHERE MAX( address_name_type_id ) > 1 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...