这是另一个奇怪的数据列。此表包含长字符串。我一直在尝试使该列可读并设法去除大部分垃圾,例如创建替换函数并在特定字符之间插入冒号,但它并没有真正增加可读性。
是否可以在最后一个数字之后打破(新行)下面显示的字符串?我不知道该怎么做,但这只是一个想法。就像说在第一个零的 X 字符之后插入换行符,因为数字以零开头并且长度相同?
这是我偶然发现的存档数据之一。
这是表格的一个示例:请注意,底部仅用于戏剧化。
谢谢!
这是另一个奇怪的数据列。此表包含长字符串。我一直在尝试使该列可读并设法去除大部分垃圾,例如创建替换函数并在特定字符之间插入冒号,但它并没有真正增加可读性。
是否可以在最后一个数字之后打破(新行)下面显示的字符串?我不知道该怎么做,但这只是一个想法。就像说在第一个零的 X 字符之后插入换行符,因为数字以零开头并且长度相同?
这是我偶然发现的存档数据之一。
这是表格的一个示例:请注意,底部仅用于戏剧化。
谢谢!
CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
WITH Pieces(pn, start, stop) AS (
SELECT 1, 1, CHARINDEX(@sep, @s)+6
UNION ALL
SELECT pn + 1, stop + 1,
CASE
WHEN (CHARINDEX(@sep, @s, stop + 1)+6)>LEN(@s)
THEN -1
ELSE CHARINDEX(@sep, @s, stop + 1)+6
END
FROM Pieces
WHERE stop > 0
)
SELECT pn,
SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
FROM Pieces
)
可以查询为
SELECT * FROM dbo.Split ('0', 'Titanic 012345 Casino Royal 012346 Terminator 098987')
请注意,如果您需要处理更长的字符串,可以更改 512。编辑:解决方案还假设电影标题本身没有“0”。
基于@PavelNefyodov 的优秀方法,一种使用PATINDEX
and的替代方法CROSS APPLY
。
这需要您提前知道您将拥有多少位数。小提琴
CREATE FUNCTION dbo.PatindexSplit (@PatternSearch varchar(100), @PatternLen SMALLINT,@s varchar(max))
RETURNS table
AS
RETURN (
WITH Pieces(pn, Piece, rest) AS (
SELECT 1, LEFT(@s, PATINDEX(@PatternSearch, @s)+@PatternLen), SUBSTRING(@s, PATINDEX(@PatternSearch, @s)+@PatternLen+1,LEN(@s))
UNION ALL
SELECT pn + 1,
CASE WHEN PATINDEX(@PatternSearch, rest) > 0
THEN LEFT(rest, PATINDEX(@PatternSearch, rest)+@PatternLen)
ELSE rest
END,
CASE WHEN PATINDEX(@PatternSearch, rest) > 0
THEN SUBSTRING(rest, PATINDEX(@PatternSearch, rest)+@PatternLen+1,LEN(rest))
ELSE ''
END
FROM Pieces
WHERE LEN(rest) > 0
)
SELECT pn,Piece, rest
FROM Pieces
)
go
SELECT userID, Piece FROM Rentals
CROSS APPLY dbo.PatindexSplit ('%0[0-9][0-9][0-9][0-9][0-9] %', 6, MovieTitle)
SELECT * FROM dbo.PatindexSplit ('%0[0-9][0-9][0-9][0-9][0-9] %', 6, 'Titanic 012345 Casino Royal 012346 Terminator 098987')
无论如何1+在应用程序层中做到这一点......