rgh*_*rgh 7 sql t-sql sql-server sql-server-2008
我有一个数据库字段,其中包含存储为多行字符串的地址信息.
88 Park View
Hemmingdale
London
Run Code Online (Sandbox Code Playgroud)
谁能告诉我将第1行,第2行和第3行作为select语句中的不同字段的最佳方法?
关心理查德
尝试这样的事情?请注意,这有点脆弱
DECLARE @S VARCHAR(500), @Query VARCHAR(1000)
SELECT @S='88 Park View
Hemmingdale
London'
SELECT @Query=''''+ REPLACE(@S, CHAR(13),''',''')+''''
EXEC('SELECT '+@Query)
Run Code Online (Sandbox Code Playgroud)
结果
88 Park View | Hemmingdale | London
Run Code Online (Sandbox Code Playgroud)
这是我想到的一种解决方案,它使用CTE来递归地迭代一个值表,并用新行将其拆分CHAR(13),然后使用a PIVOT来显示结果。您可以将其扩展到其他列(超过5列),只需将其添加到中即可PIVOT。
DECLARE @Table AS TABLE(ID int, SomeText VARCHAR(MAX))
INSERT INTO @Table VALUES(1, '88 Park View
Hemmingdale
London')
INSERT INTO @Table VALUES(2, '100 Main Street
Hemmingdale
London')
INSERT INTO @Table VALUES(3, '123 6th Street
Appt. B
Hemmingdale
London')
;WITH SplitValues (ID, OriginalValue, SplitValue, Level)
AS
(
SELECT ID, SomeText, CAST('' AS VARCHAR(MAX)), 0 FROM @Table
UNION ALL
SELECT ID
, SUBSTRING(OriginalValue, CASE WHEN CHARINDEX(CHAR(13), OriginalValue) = 0 THEN LEN(OriginalValue) + 1 ELSE CHARINDEX(CHAR(13), OriginalValue) + 2 END, LEN(OriginalValue))
, SUBSTRING(OriginalValue, 0, CASE WHEN CHARINDEX(CHAR(13), OriginalValue) = 0 THEN LEN(OriginalValue) + 1 ELSE CHARINDEX(CHAR(13), OriginalValue) END)
, Level + 1
FROM SplitValues
WHERE LEN(SplitValues.OriginalValue) > 0
)
SELECT ID, [1] AS Level1, [2] AS Level2, [3] AS Level3, [4] AS Level4, [5] AS Level5
FROM (
SELECT ID, Level, SplitValue
FROM SplitValues
WHERE Level > 0
) AS p
PIVOT (MAX(SplitValue) FOR Level IN ([1], [2], [3], [4], [5])) AS pvt
Run Code Online (Sandbox Code Playgroud)
结果:
ID Level1 Level2 Level3 Level4 Level5
----------- -------------------- -------------------- -------------------- -------------------- --------------------
1 88 Park View Hemmingdale London NULL NULL
2 100 Main Street Hemmingdale London NULL NULL
3 123 6th Street Appt. B Hemmingdale London NULL
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12812 次 |
| 最近记录: |