Объединение или упрощение трех заявлений в одном - PullRequest
0 голосов
/ 31 марта 2020

Я бы слил ниже 3 падежных операторов в одно и максимально упростил. Цель запроса - найти любого участника с недействительным или действительным номером телефона на основе 3 столбцов. если какой-либо столбец имеет действительный номер телефона, он действителен. если все они недействительны, считайте их недействительными. Любая помощь будет очень полезна.

    CASE 
        WHEN REGEXP_REPLACE(DAY_PH, '[^[:digit:]'''']', NULL) IS NULL
            THEN 1
  WHEN REGEXP_REPLACE(DAY_PH, '[^[:digit:]'''']', NULL) ='9999999999'
    THEN 1
        WHEN LENGTH(TRIM(REGEXP_REPLACE(DAY_PH, '[^[:digit:]'''']', NULL))) = 10
            THEN 0
        ELSE 1
        END INVALID_DAY_PH,
    CASE 
        WHEN REGEXP_REPLACE(EVE_PH, '[^[:digit:]'''']', NULL) IS NULL
            THEN 1
  WHEN  REGEXP_REPLACE(EVE_PH, '[^[:digit:]'''']', NULL)='9999999999'
    THEN 1  
        WHEN LENGTH(TRIM(REGEXP_REPLACE(EVE_PH, '[^[:digit:]'''']', NULL))) = 10
            THEN 0
        ELSE 1
        END INVALID_EVE_PH,
    CASE 
        WHEN REGEXP_REPLACE(MOB_PH, '[^[:digit:]'''']', NULL) IS NULL
            THEN 1
   WHEN REGEXP_REPLACE(MOB_PH, '[^[:digit:]'''']', NULL)='9999999999'
    THEN 1  
        WHEN LENGTH(TRIM(REGEXP_REPLACE(MOB_PH, '[^[:digit:]'''']', NULL))) = 10
            THEN 0
        ELSE 1
        END INVALID_MOB_PH,

1 Ответ

1 голос
/ 31 марта 2020

Вы можете немного упростить, просто помещая вызовы регулярных выражений во встроенное представление или CTE, чтобы вам не приходилось повторять их:

select id, day_ph, eve_ph, mob_ph,
  case when length(day_ph_cln) = 10 and day_ph_cln != '9999999999'
    then 0 else 1 end as invalid_day_ph,
  case when length(eve_ph_cln) = 10 and eve_ph_cln != '9999999999'
    then 0 else 1 end as invalid_eve_ph,
  case when length(mob_ph_cln) = 10 and mob_ph_cln != '9999999999'
    then 0 else 1 end as invalid_mob_ph
from (
  select id, day_ph, eve_ph, mob_ph,
    regexp_replace(day_ph, '[^[:digit:]'''']') as day_ph_cln,
    regexp_replace(eve_ph, '[^[:digit:]'''']') as eve_ph_cln,
    regexp_replace(mob_ph, '[^[:digit:]'''']') as mob_ph_cln
  from your_table
);

Кажется, что trim() не делает все, что я пропустил - регулярное выражение уже удалит все пробелы, поскольку они не являются цифрами (или одиночными кавычками ... Я оставил шаблон без изменений, хотя и не уверен, что он имеет смысл ...)

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

select id, day_ph, eve_ph, mob_ph,
  case when length(day_ph_cln) = 10 and day_ph_cln != '9999999999'
    then 0 else 1 end as invalid_day_ph,
  case when length(eve_ph_cln) = 10 and eve_ph_cln != '9999999999'
    then 0 else 1 end as invalid_eve_ph,
  case when length(mob_ph_cln) = 10 and mob_ph_cln != '9999999999'
    then 0 else 1 end as invalid_mob_ph,
  least(
    case when length(day_ph_cln) = 10 and day_ph_cln != '9999999999'
      then 0 else 1 end,
    case when length(eve_ph_cln) = 10 and eve_ph_cln != '9999999999'
      then 0 else 1 end,
    case when length(mob_ph_cln) = 10 and mob_ph_cln != '9999999999'
      then 0 else 1 end
  ) as all_invalid
from (
  select id, day_ph, eve_ph, mob_ph,
    regexp_replace(day_ph, '[^[:digit:]'''']') as day_ph_cln,
    regexp_replace(eve_ph, '[^[:digit:]'''']') as eve_ph_cln,
    regexp_replace(mob_ph, '[^[:digit:]'''']') as mob_ph_cln
  from your_table
);

или используйте другой уровень подзапроса (или CTE) для удаления повторения:

select id, day_ph, eve_ph, mob_ph,
  invalid_day_ph, invalid_eve_ph, invalid_mob_ph,
  least(invalid_day_ph, invalid_eve_ph, invalid_mob_ph) as all_invalid
from (
  select id, day_ph, eve_ph, mob_ph,
    case when length(day_ph_cln) = 10 and day_ph_cln != '9999999999'
      then 0 else 1 end as invalid_day_ph,
    case when length(eve_ph_cln) = 10 and eve_ph_cln != '9999999999'
      then 0 else 1 end as invalid_eve_ph,
    case when length(mob_ph_cln) = 10 and mob_ph_cln != '9999999999'
      then 0 else 1 end as invalid_mob_ph
  from (
    select id, day_ph, eve_ph, mob_ph,
      regexp_replace(day_ph, '[^[:digit:]'''']') as day_ph_cln,
      regexp_replace(eve_ph, '[^[:digit:]'''']') as eve_ph_cln,
      regexp_replace(mob_ph, '[^[:digit:]'''']') as mob_ph_cln
    from your_table
  )
);

Если вы только хотите этот конечный флаг, вы можете объединить выражения падежа :

select id, day_ph, eve_ph, mob_ph,
  case when (length(day_ph_cln) = 10 and day_ph_cln != '9999999999')
         or (length(eve_ph_cln) = 10 and eve_ph_cln != '9999999999')
         or (length(mob_ph_cln) = 10 and mob_ph_cln != '9999999999')
    then 0 else 1 end as all_invalid
from (
  select id, day_ph, eve_ph, mob_ph,
    regexp_replace(day_ph, '[^[:digit:]'''']') as day_ph_cln,
    regexp_replace(eve_ph, '[^[:digit:]'''']') as eve_ph_cln,
    regexp_replace(mob_ph, '[^[:digit:]'''']') as mob_ph_cln
  from your_table
);

Вы не предоставили образец данных, чтобы убедиться, что он дает желаемые результаты; но вот дБ <> скрипка с некоторыми очень базовыми c подготовленными данными.

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