0

这是另一个奇怪的数据列。此表包含长字符串。我一直在尝试使该列可读并设法去除大部分垃圾,例如创建替换函数并在特定字符之间插入冒号,但它并没有真正增加可读性。

是否可以在最后一个数字之后打破(新行)下面显示的字符串?我不知道该怎么做,但这只是一个想法。就像说在第一个零的 X 字符之后插入换行符,因为数字以零开头并且长度相同?

这是我偶然发现的存档数据之一。

这是表格的一个示例:请注意,底部仅用于戏剧化。

在此处输入图像描述

谢谢!

4

2 回答 2

1
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”。

来自提供原始解决方案链接Cade Roux的想法

于 2013-08-08T09:27:25.510 回答
1

基于@PavelNefyodov 的优秀方法,一种使用PATINDEXand的替代方法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+在应用程序层中做到这一点......

于 2013-08-08T13:16:49.453 回答