Advertisement
Guest User

Untitled

a guest
Aug 29th, 2017
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 2.92 KB | None | 0 0
  1. --- Query to order and identify spoiler-ridden questions on anime.SE
  2.  
  3. DECLARE @qt_st INT;
  4. DECLARE @qt_cnt INT;
  5. DECLARE @qt_bdy NVARCHAR(MAX);
  6. DECLARE @pst_cnt INT;
  7. DECLARE @pst_cnt_v INT = 1;
  8. DECLARE @cur_pst INT;
  9. DECLARE @to_search INT;
  10.  
  11. -- first pass stripping HTML tags, adapted from https://stackoverflow.com/a/457725/
  12. DECLARE @sta_string INT;
  13. DECLARE @end_string INT;
  14. DECLARE @len_string INT;
  15. DECLARE @stripped_body NVARCHAR(MAX);
  16.  
  17.  
  18. -- at first, all posts containing spoilers are heaped into a temporary table, to improve performance
  19. SELECT
  20. p.Id,
  21. p.Body,
  22. 1 AS sp_amnt,
  23. 1 AS bdy_amnt,
  24. p.CreationDate
  25.  
  26. INTO #temp_posts
  27.  
  28. FROM Posts AS p
  29.  
  30. WHERE ( CHARINDEX('<blockquote class="spoiler">', p.Body) > 0) AND ( p.PostTypeId = 1 );
  31.  
  32. SET @pst_cnt = ( SELECT COUNT(*) AS COUNT FROM #temp_posts );
  33.  
  34. -- iterates across every single post in the temporary table
  35. WHILE @pst_cnt_v <= @pst_cnt
  36.   BEGIN
  37.     SELECT @cur_pst = tmp_pst.Id, @qt_bdy = tmp_pst.Body
  38.     FROM
  39.     (
  40.       SELECT
  41.       #temp_posts.Id AS Id,
  42.       #temp_posts.Body AS Body,
  43.       ROW_NUMBER() OVER (ORDER BY #temp_posts.Id ASC) AS cur_row
  44.       FROM #temp_posts
  45.     ) AS tmp_pst
  46.     WHERE cur_row = @pst_cnt_v;
  47.    
  48.     SET @qt_st = 1;
  49.     SET @qt_cnt = 0;
  50.     SET @to_search = 1;
  51.     WHILE @qt_st != 0 AND @qt_st IS NOT NULL
  52.       BEGIN
  53.             -- CHARINDEX returns the starting position of the
  54.             -- search string and the search string is 27 chars long
  55.             SET @qt_st = CHARINDEX('<blockquote class="spoiler">', @qt_bdy, @to_search) + 27;
  56.             SET @to_search = @to_search + @qt_st;
  57.         IF @to_search >= LEN(@qt_bdy)
  58.             SET @qt_st = 0;
  59.         IF @qt_st != 0 AND @qt_st IS NOT NULL
  60.           SET @qt_cnt = @qt_cnt + ( CHARINDEX('</blockquote>', @qt_bdy, @qt_st) - @qt_st );
  61.       END
  62.     -- first pass attempting to strip HTML tags before processing, adapted from https://stackoverflow.com/a/457725/
  63.     SET @stripped_body = @qt_bdy;
  64.     SET @sta_string = CHARINDEX('<',@stripped_body)
  65.     SET @end_string = CHARINDEX('>',@stripped_body,CHARINDEX('<',@stripped_body))
  66.     SET @len_string = (@end_string - @sta_string) + 1
  67.     WHILE @sta_string > 0 AND @end_string > 0 AND @len_string > 0
  68.       BEGIN
  69.           SET @stripped_body = STUFF(@stripped_body,@sta_string,@len_string,'')
  70.           SET @sta_string = CHARINDEX('<',@stripped_body)
  71.           SET @end_string = CHARINDEX('>',@stripped_body,CHARINDEX('<',@stripped_body))
  72.           SET @len_string = (@end_string - @sta_string) + 1
  73.       END  
  74.     UPDATE #temp_posts SET sp_amnt = @qt_cnt, bdy_amnt = LEN(LTRIM(RTRIM(@stripped_body))) WHERE Id = @cur_pst
  75.     SET @pst_cnt_v = @pst_cnt_v + 1;
  76.   END
  77.  
  78. SELECT
  79.  
  80. Id AS [Post Link],
  81. CreationDate AS [Post DATE],
  82. bdy_amnt AS [Lenght OF Post (chars)],
  83. sp_amnt AS [Spoiler Content (chars)],
  84. ( sp_amnt * 100 / bdy_amnt ) AS [Percent Spoiler]
  85.  
  86. FROM #temp_posts
  87.  
  88. ORDER BY ( sp_amnt * 100 / bdy_amnt ) DESC
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement