NULL поля после выполнения LENGTH (email_address) - PullRequest
0 голосов
/ 02 января 2019

У меня проблема, я хотел получить максимальную длину поля , потому что я хотел знать, есть ли поля, размер которых превышает размер, установленный для этого поля, например: varchar2 (20)

Я использую оракул 11g, посмотрите на это:

https://i.stack.imgur.com/4DdWM.jpg

Итак, я сделал этот запрос:

    SELECT
    hp.party_name                              
  , hca.account_number
  , hca.cust_account_id                        
 -- , hcsu.LOCATION customer_site_name
  , hcas.cust_acct_site_id                     
  , hcp.phone_number
  , hcp.email_address
  , hl.address1
  , hl.address2
  , hl.address3
  , hl.address4
  , hl.city
  , hl.province
  , hl.postal_code
  , hcas.status                                
  , DECODE( hcas.attribute5, 'PUP', 'Y', 'N' ) 
  , hca.status                                 
FROM apps.hz_cust_accounts hca
INNER JOIN apps.hz_cust_acct_sites_all hcas ON hca.cust_account_id = hcas.cust_account_id
INNER JOIN apps.hz_party_sites hps ON hcas.party_site_id = hps.party_site_id
INNER JOIN apps.hz_locations hl ON hps.location_id = hl.location_id
INNER JOIN apps.hz_parties hp ON hps.party_id = hp.party_id
LEFT JOIN (
        SELECT
            owner_table_id
          , max(case when contact_point_type = 'PHONE' then phone_number end) phone_number
          , max(case when contact_point_type = 'EMAIL' then email_address end) email_address
        FROM hz_contact_points
        WHERE status = 'A'
        AND primary_flag = 'Y'
        AND owner_table_name = 'HZ_PARTY_SITES'
        AND contact_point_type IN ('EMAIL','PHONE')
        AND length (phone_number) > 40
        GROUP BY 
            owner_table_id
    ) hcp ON hcas.party_site_id = hcp.owner_table_id 
WHERE hcas.status = 'A'
AND hps.status = 'A'
AND hca.status = 'A'
AND hca.account_number = ''
;

Я поставил это условие "И длина (номер телефона)> 40" , но оно не работает, потому что показывает нулевые поля, почему?

Взгляните на это: IMAGE

Кроме того, это состояние хорошо?

hcp ON hcas.party_site_id = hcp.owner_table_id 

Не могли бы вы помочь мне с этим?

PS: я использую SQL DEVELOPER и базу данных Oracle 11g

Ответы [ 2 ]

0 голосов
/ 02 января 2019

То, как вы изменили запрос, выглядит не очень хорошо. Вы добавили предложение WHERE в подзапрос, который используется для восстановления электронной почты и номера телефона пользователя из таблицы hz_contact_point. Теперь похоже, что подзапрос ничего не возвращает, а связанные поля равны NULL в результатах (если бы вы использовали INNER JOIN вместо LEFT JOIN, у вас вообще не было бы результатов),

Если вам просто нужно контролировать или форматировать вывод, не изменяйте подзапрос: он может нарушить логику. Используйте основной запрос. Например, в приведенном ниже примере телефонный номер заменяется на NULL, если он содержит более 40 символов.

SELECT
     hp.party_name
    , hca.account_number
    ...
    , CASE WHEN LENGTH(hcp.phone_number) > 40 THEN NULL ELSE hcp.phone_number END
    , hcp.email_address
...
0 голосов
/ 02 января 2019

Вы оставили присоединение к этому подзапросу с псевдонимом hcp, поэтому, если нет соответствующих строк из hcp для некоторых строк других таблиц, которые были объединены ранее, значения из hcp равны NULL для этих строк.

Но если phone_number объявлено как varchar2(40), вы не найдете телефонных номеров с length(phone_number) > 40. Они были бы отклонены, если бы кто-то попытался вставить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...