Это ужасно противно ... Я настоятельно рекомендую, если вы хотите обработать каждую адресную строку отдельно, что вы храните его правильно в первую очередь. Вместо того, чтобы продолжать делать то, что вы делаете, добавьте дополнительные столбцы, исправьте существующие данные один раз (вместо того, чтобы «исправлять» его каждый раз, когда вы запускаете запрос), а затем настраиваете хранимую процедуру, которая выполняет вставку/обновление так что он знает, как использовать другие столбцы.
DECLARE @Address TABLE(id INT IDENTITY(1,1), ad VARCHAR(MAX));
INSERT @Address(ad) SELECT 'line 1
line 2
line 3
line 4'
UNION ALL SELECT 'row 1
row 2
row 3'
UNION ALL SELECT 'address 1
address 2'
UNION ALL SELECT 'only 1 entry here'
UNION ALL SELECT 'let us try 5 lines
line 2
line 3
line 4
line 5';
SELECT
id,
Line1 = REPLACE(REPLACE(COALESCE(Line1, ''), CHAR(10), ''), CHAR(13), ''),
Line2 = REPLACE(REPLACE(COALESCE(Line2, ''), CHAR(10), ''), CHAR(13), ''),
Line3 = REPLACE(REPLACE(COALESCE(SUBSTRING(Rest, 1, COALESCE(NULLIF(CHARINDEX(CHAR(10), Rest), 0), LEN(Rest))), ''), CHAR(10), ''), CHAR(13), ''),
Line4 = REPLACE(REPLACE(COALESCE(SUBSTRING(Rest, NULLIF(CHARINDEX(CHAR(10), Rest) + 1, 1), LEN(Rest)), ''), CHAR(10), ''), CHAR(13), '')
FROM
(
SELECT
id,
ad,
Line1,
Line2 = SUBSTRING(Rest, 1, COALESCE(NULLIF(CHARINDEX(CHAR(10), Rest), 0), LEN(Rest))),
Rest = SUBSTRING(Rest, NULLIF(CHARINDEX(CHAR(10), Rest) + 1, 1), LEN(Rest))
FROM
(
SELECT
id,
ad,
Line1 = SUBSTRING(ad, 1, COALESCE(NULLIF(CHARINDEX(CHAR(10), ad), 0), LEN(ad))),
Rest = SUBSTRING(ad, NULLIF(CHARINDEX(CHAR(10), ad) + 1, 1), LEN(ad))
FROM
@address
) AS x
) AS y
ORDER BY id;
ParseName() трюк Дениса гораздо опрятнее, конечно, но вы должны быть очень осторожны при использовании замены символа, который действительно невозможно появиться в данных, естественно. Карат (^), вероятно, хорошая ставка, но, как я уже сказал, вам нужно быть осторожным.
Существуют также программные пакеты, которые действительно хороши при очистке адреса и других демографических данных. Но очистка ввода данных является самой важной вещью здесь, и я буду продолжать подчеркивать ... если каждую адресную строку нужно рассматривать отдельно, а затем хранить ее таким образом.
Любая вероятность, что данные * не * сохранены в пределах одного столбца? –
Все адресные строки хранятся в одном столбце. – Jamie