Следующий запрос должен помочь:
SELECT REGEXP_REPLACE(sql_query_part_1_tx, '(\w+)\s*<>', 'COALESCE(\1, 9999) <>')
FROM mytable;
Объяснение регулярного выражения:
'(\w+)\s*<>'
захватывает слова (то есть последовательные буквенно-цифровые символы и символы подчеркивания) слева от<>
знак с необязательной последовательностью пробелов между 'COALESCE(\1, 9999) <>'
: заменяет совпавшую строку записанным словом (именем столбца), именуемым '\ 1'
Эта демонстрация на скрипте БД с вашими примерами возвращаемых данных:
| REGEXP_REPLACE(SQL_QUERY_PART_1_TX,'(\W+)\S*<>','COALESCE(\1,9999)<>') |
| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| SELECT SUM(BAL_AM) FROM SCH.DERHCE03 WHERE 1=1 AND COALESCE(HIRHCC04, 9999)<>'US' AND HIRHCE01 IN ('TDCD','TDOA','IRATD') AND HIREG039 IN ((660),(661),(604)) AND COALESCE(HIREG234, 9999)<> 345 ; |
| SELECT SUM(BAL_AM) FROM SCH.DEFD1520 WHERE 1=1 AND HIRHCV04='Y' AND COALESCE(HIRHCC04, 9999)<>'US' AND HIRHCN17='FDIC' AND COALESCE(HIFD1516, 9999)<>'Y' AND HIFD1527='FDIC'; |
| SELECT SUM(OUTSTANDING_AM) FROM SCH.DEFD1520 WHERE 1=1 AND HIRHCV04='Y' AND COALESCE(HIRHCC04, 9999)<>'US' AND HIRHCN17='FDIC' AND HIFD1516='Y'; |
Кстати, позвольте мне предложить оптимизацию вашей логики замены.
Это:
COALESCE(HIRHCC04, 9999)<>'US'
Обычно пишется лучше:
(HIRHCC04 IS NULL OR HIRHCC04 <> 'US')
Второе выражение является более явным и более эффективным, поскольку оно с радостью использует существующий индекс для столбца.фильтруется (пока первое выражение не будет).Это также позволяет избежать потенциальных проблем преобразования, когда проверяемый столбец не является числом.
Эти выражения могут быть сгенерированы с помощью следующего регулярного выражения:
SELECT REGEXP_REPLACE(
sql_query_part_1_tx,
'(\w+)\s*<>\s*''(\w+)''',
'(\1 IS NULL OR \1 <> ''\2'')'
)
FROM mytable;
Демонстрация в БДСкрипка :
| REGEXP_REPLACE(SQL_QUERY_PART_1_TX,'(\W+)\S*<>\S*''(\W+)''','(\1ISNULLOR\1<>''\2'')') |
| :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| SELECT SUM(BAL_AM) FROM SCH.DERHCE03 WHERE 1=1 AND (HIRHCC04 IS NULL OR HIRHCC04 <> 'US') AND HIRHCE01 IN ('TDCD','TDOA','IRATD') AND HIREG039 IN ((660),(661),(604)) AND HIREG234 <> 345 ; |
| SELECT SUM(BAL_AM) FROM SCH.DEFD1520 WHERE 1=1 AND HIRHCV04='Y' AND (HIRHCC04 IS NULL OR HIRHCC04 <> 'US') AND HIRHCN17='FDIC' AND (HIFD1516 IS NULL OR HIFD1516 <> 'Y') AND HIFD1527='FDIC'; |
| SELECT SUM(OUTSTANDING_AM) FROM SCH.DEFD1520 WHERE 1=1 AND HIRHCV04='Y' AND (HIRHCC04 IS NULL OR HIRHCC04 <> 'US') AND HIRHCN17='FDIC' AND HIFD1516='Y'; |
ОБНОВЛЕНИЕ
Вот обновленный запрос, который также обрабатывает предложения NOT IN
и разрешает обацифры и строки в левой части оператора <>
(и в списках NOT IN
):
SELECT REGEXP_REPLACE(
REGEXP_REPLACE(sql_query_part_1_tx, '(\w+)\s*<>\s*(''*\w+''*)', '(\1 IS NULL OR \1 <> \2)'),
'(\w+)\s*NOT IN\s*(\([^)]+\))',
'(\1 IS NULL OR \1 NOT IN \2)'
) FROM mytable;
Демонстрация на DB Fiddle ;
| REGEXP_REPLACE(REGEXP_REPLACE(SQL_QUERY_PART_1_TX,'(\W+)\S*<>\S*(''*\W+''*)','(\1ISNULLOR\1<>\2)'),'(\W+)\S*NOTIN\S*(\([^)]+\))','(\1ISNULLOR\1NOTIN\2)') |
| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| SELECT SUM(BAL_AM) FROM SCH.DERHCE03 WHERE 1=1 AND (HIRHCC04 IS NULL OR HIRHCC04 <> 'US') AND (HIRHCE01 IS NULL OR HIRHCE01 NOT IN ('TDCD','TDOA','IRATD')) AND HIREG039 IN ((660),(661),(604)) AND (HIREG234 IS NULL OR HIREG234 <> 345) ; |
| SELECT SUM(BAL_AM) FROM SCH.DEFD1520 WHERE 1=1 AND HIRHCV04='Y' AND (HIRHCC04 IS NULL OR HIRHCC04 <> 'US') AND HIRHCN17='FDIC' AND (HIFD1516 IS NULL OR HIFD1516 <> 'Y') AND HIFD1527='FDIC'; |
| SELECT SUM(OUTSTANDING_AM) FROM SCH.DEFD1520 WHERE 1=1 AND HIRHCV04='Y' AND (HIRHCC04 IS NULL OR HIRHCC04 <> 'US') AND HIRHCN17='FDIC' AND HIFD1516='Y'; |