В
КЛАДР номера домов представлены пятью способами.
- Непосредственно номер дома (1А)
- Последовательность номеров домов (1А,1В)
- Диапазоном номеров домов (1-10)
- Последовательность домов с четными номера (Ч(1-10))
- Последовательность домов с нечетными номерами (Н(1-10))
Преобразуем 1 и 2 представление в множество.SELECT
FROM
(SELECTunnest(string_to_array(HOUSE, ',')) as HOUSE, | (SELECT ID FROM W_LOCALITY_TYPE WHERE NAME=TYPE) as TYPE, | CODE as CODE | FROMkladr_base.w_doma_tbl) T1 |
|
WHERE
HOUSE!~'^[0-9]+-[0-9]+$' AND |
HOUSE!~'^(Н|Ч)\([0-9]+-[0-9]+\)$'; |
Преобразуем 3 представление в множество.
WITH RECURSIVE T1 as (
SELECTrow_number() over() as RN, | string_to_array(HOUSE, '-') as HOUSE, | (SELECT ID FROM W_LOCALITY_TYPE WHERE NAME=TYPE) as TYPE, | CODE | FROM(SELECTunnest(string_to_array(HOUSE, ',')) as HOUSE, | TYPE AS TYPE, | CODE as CODE | FROMkladr_base.w_doma_tbl) T10 |
| WHEREHOUSE~'^[0-9]+-[0-9]+$'), |
|
T2(RN, CODE, TYPE, HOUSE) AS (
SELECTRN, | CODE, | TYPE, | HOUSE[1]::INT AS HOUSE | FROMUNION ALL SELECTT2.RN, | T2.CODE, | T2.TYPE, | T2.HOUSE + 1 AS HOUSE | FROMT1 INNER JOIN T2 ON T2.RN=T1.RN | WHERET2.HOUSE >= T1.HOUSE[1]::INT AND | (T2.HOUSE + 1) <= T1.HOUSE[2]::INT) |
|
SELECT
FROM
Преобразуем 4 и 5 представление в множество.
WITH RECURSIVE T3 as (
SELECTrow_number() over() as RN, | string_to_array(substring(HOUSE from '[0-9]+-[0-9]+'), '-') as HOUSE, | (SELECT ID FROM W_LOCALITY_TYPE WHERE NAME=TYPE) as TYPE, | CODE | FROM(SELECTunnest(string_to_array(HOUSE, ',')) as HOUSE, | TYPE as TYPE, | CODE as CODE | FROMkladr_base.w_doma_tbl) T10 |
| WHEREHOUSE~'^(Н|Ч)\([0-9]+-[0-9]+\)$'), |
|
T4(RN, CODE, TYPE, HOUSE) AS (
SELECTRN, | CODE, | TYPE, | HOUSE[1]::INT AS HOUSE | FROMUNION ALL SELECTT4.RN, | T4.CODE, | T4.TYPE, | T4.HOUSE + 2 AS HOUSE | FROMT3 INNER JOIN T4 ON T4.RN=T3.RN | WHERET4.HOUSE >= T3.HOUSE[1]::INT AND | (T4.HOUSE + 2) <= T3.HOUSE[2]::INT) |
|
SELECT
FROM
Объединим получившиеся решения.
WITH RECURSIVE T1 as (
SELECTrow_number() over() as RN, | string_to_array(HOUSE, '-') as HOUSE, | (SELECT ID FROM W_LOCALITY_TYPE WHERE NAME=TYPE) as TYPE, | CODE | FROM(SELECT unnest(string_to_array(HOUSE, ',')) as HOUSE, | TYPE AS TYPE, | CODE as CODE | FROMkladr_base.w_doma_tbl) T10 |
| WHEREHOUSE~'^[0-9]+-[0-9]+$'), |
|
T2(RN, CODE, TYPE, HOUSE) AS (
SELECTRN, | CODE, | TYPE, | HOUSE[1]::INT AS HOUSE | FROMUNION ALL SELECTT2.RN, | T2.CODE, | T2.TYPE, | T2.HOUSE + 1 AS HOUSE | FROMT1 INNER JOIN T2 ON T2.RN=T1.RN | WHERET2.HOUSE >= T1.HOUSE[1]::INT AND | (T2.HOUSE + 1) <= T1.HOUSE[2]::INT), |
|
T3 as (
SELECTrow_number() over() as RN, | string_to_array(substring(HOUSE from '[0-9]+-[0-9]+'), '-') as HOUSE, | (SELECT ID FROM W_LOCALITY_TYPE WHERE NAME=TYPE) as TYPE, | CODE | FROM(SELECTunnest(string_to_array(HOUSE, ',')) as HOUSE, | TYPE as TYPE, | CODE as CODE | FROMkladr_base.w_doma_tbl) T10 |
| WHEREHOUSE~'^(Н|Ч)\([0-9]+-[0-9]+\)$'), |
|
T4(RN, CODE, TYPE, HOUSE) AS (
SELECTRN, | CODE, | TYPE, | HOUSE[1]::INT AS HOUSE | FROMUNION ALL SELECTT4.RN, | T4.CODE, | T4.TYPE, | T4.HOUSE + 2 AS HOUSE | FROMT3 INNER JOIN T4 ON T4.RN=T3.RN | WHERET4.HOUSE >= T3.HOUSE[1]::INT AND | (T4.HOUSE + 2) <= T3.HOUSE[2]::INT) |
|
SELECT
CODE, |
TYPE, |
to_char(HOUSE, '99999') |
FROM
UNION ALL
SELECT
CODE, |
TYPE, |
to_char(HOUSE, '99999') |
FROM
UNION ALL
SELECT
FROM
(SELECTunnest(string_to_array(HOUSE, ',')) as HOUSE, | (SELECT ID FROM W_LOCALITY_TYPE WHERE NAME=TYPE) as TYPE, | CODE as CODE | FROMkladr_base.w_doma_tbl) T1 |
|
WHERE
HOUSE!~'^[0-9]+-[0-9]+$' AND |
HOUSE!~'^(Н|Ч)\([0-9]+-[0-9]+\)$'; |
No comments:
Post a Comment