Вы можете немного упростить, просто помещая вызовы регулярных выражений во встроенное представление или 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 подготовленными данными.