Предполагая, что вы используете сервер Informix 14.10, а не более раннюю версию, такую как 12.10 или 11.70 (или что-то более старое, которое не поддерживается), тогда вы можете рассмотреть:
WITH mapped_cities(city_code, city_name) AS
(SELECT city_code, city_name FROM city_codes
UNION
SELECT '7' || city_code, city_name FROM city_codes
UNION
SELECT '8' || city_code, city_name FROM city_codes
)
SELECT d.num, m.city_name AS call_from
FROM dialled_phone_numbers AS d
JOIN mapped_cities AS m
ON m.city_code = LEFT(d.num, LENGTH(m.city_code))
с примером таблицы и данные настраиваются с использованием следующего (некоторые данные из вопроса, некоторые данные из комментариев):
CREATE TABLE dialled_phone_numbers(num VARCHAR(11) NOT NULL PRIMARY KEY);
CREATE TABLE city_codes(city_code VARCHAR(5) NOT NULL PRIMARY KEY, city_name VARCHAR(25) NOT NULL);
INSERT INTO city_codes VALUES('812', 'St.Petersburg');
INSERT INTO city_codes VALUES('3812', 'Omsk');
INSERT INTO city_codes VALUES('495', 'Moscow');
INSERT INTO city_codes VALUES('38551', 'Kalmanka');
INSERT INTO dialled_phone_numbers VALUES('3812217715');
INSERT INTO dialled_phone_numbers VALUES('3855113524');
INSERT INTO dialled_phone_numbers VALUES('4951357246');
INSERT INTO dialled_phone_numbers VALUES('73855154321');
INSERT INTO dialled_phone_numbers VALUES('74957654321');
INSERT INTO dialled_phone_numbers VALUES('84951234567');
показанный запрос производит вывод:
num call_from
VARCHAR(11) VARCHAR(25)
3812217715 Omsk
3855113524 Kalmanka
4951357246 Moscow
73855154321 Kalmanka
74957654321 Moscow
84951234567 Moscow
Ясно, что Предложение ORDER BY может быть использовано для лучшей последовательности вещей.
Предложение WITH создает список префиксов с «ничем» или с 7 или 8 в качестве префикса. Затем это используется для объединения с началом чисел в таблице dialled_phone_numbers
, используя условие соединения из первого сегмента кода в Гордон Линофф ответ .
Если у вас более старая версия Informix без предложения WITH (выражение общей таблицы или CTE), вы можете использовать временную таблицу для хранения результатов подзапроса UNION, использованного в предложении WITH, и присоединиться к нему. вместо этого.