简体   繁体   English

如何替换所有长度为8个字符的数字,例如12345678

[英]How to replace all numbers of exactly 8 characters in length eg 12345678

I've done a good bit of searching all over so don't berate me yet. 我已经在整个搜索过程中做了很多工作,所以请不要再责备我了。

I have a column with string values showing the name of shows. 我有一列显示了演出名称的字符串值。

Eg: 例如:

[Titles]
World Cup 2014
Family Guy
UFC Fight Night
9pm News and Weather
2014 Media Awards
Homeland 25242324
Simpsons 25242314
Shameless
Soccer Night 45342324 International
Rugby Live 45342324 HTML5

I wish to use a select statement to strip out the numbers where the numbers are exactly 8 characters in length. 我希望使用select语句删除数字,其中数字的长度恰好是8个字符。

I have only read access so cannot create functions and I'm using SQL Server 2005. 我只有读取权限,因此无法创建函数,并且我正在使用SQL Server 2005。

There are a number of split functions that can be found around the internet. 在互联网上可以找到许多拆分功能。 My personal preference is the one created by Jeff Moden and enhanced by the community over the last few years. 我个人的偏爱是Jeff Moden创建的,并在最近几年中被社区增强。 You can find his article here, http://www.sqlservercentral.com/articles/Tally+Table/72993/ . 您可以在http://www.sqlservercentral.com/articles/Tally+Table/72993/中找到他的文章。 Make sure you look at the comments...there are a few hundred at the time of this posting. 确保您查看评论...在发布时有数百条评论。 Here is the code for that splitter. 这是该拆分器的代码。

CREATE FUNCTION [dbo].[DelimitedSplit8K]
--===== Define I/O parameters
        (@pString VARCHAR(8000), @pDelimiter CHAR(1))
RETURNS TABLE WITH SCHEMABINDING AS
 RETURN
--===== "Inline" CTE Driven "Tally Table" produces values from 0 up to 10,000...
     -- enough to cover VARCHAR(8000)
  WITH E1(N) AS (
                 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
                 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
                 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
                ),                          --10E+1 or 10 rows
       E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
       E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
 cteTally(N) AS (--==== This provides the "zero base" and limits the number of rows right up front
                     -- for both a performance gain and prevention of accidental "overruns"
                 SELECT 0 UNION ALL
                 SELECT TOP (DATALENGTH(ISNULL(@pString,1))) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
                ),
cteStart(N1) AS (--==== This returns N+1 (starting position of each "element" just once for each delimiter)
                 SELECT t.N+1
                   FROM cteTally t
                  WHERE (SUBSTRING(@pString,t.N,1) = @pDelimiter OR t.N = 0) 
                )
--===== Do the actual split. The ISNULL/NULLIF combo handles the length for the final element when no delimiter is found.
 SELECT ItemNumber = ROW_NUMBER() OVER(ORDER BY s.N1),
        Item       = SUBSTRING(@pString,s.N1,ISNULL(NULLIF(CHARINDEX(@pDelimiter,@pString,s.N1),0)-s.N1,8000))
   FROM cteStart s
;

No matter which splitter you use (as long as it is a table valued function) it can work just like this. 无论您使用哪个拆分器(只要它是表值函数),它都可以像这样工作。

if OBJECT_ID('tempdb..#Something') is not null
    drop table #Something;

create table #Something
(
    SomeValue varchar(100)
);

insert #Something
select 'World Cup 2014' union all
select 'Family Guy' union all
select 'UFC Fight Night' union all
select '9pm News and Weather' union all
select '2014 Media Awards' union all
select 'Homeland 2524232' union all
select 'Simpsons 2524231' union all
select 'Shameless' union all
select 'Soccer Night 4534232 International' union all
select 'Rugby Live 4534232 HTML5';

with ParsedData as
(
    select * 
    from #Something s
    cross apply dbo.DelimitedSplit8K(s.SomeValue, ' ')
    where Item not like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
)

select distinct
    Stuff((SELECT ' ' + Item
              FROM ParsedData p2
              WHERE  p1.SomeValue = p2.SomeValue
              ORDER  BY p1.ItemNumber --The split function keeps track of the order for us already
              FOR XML PATH('')), 1, 1, ' ') as Details
from ParsedData p1
create table #tmp(myString varchar(255))
insert into #tmp
values('Soccer Night 45342327 International'),('9pm News and Weather')



    Select newstring = case when  patindex('%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%',mystring) > 0 then
        left(mystring, patindex('%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%',mystring) - 1) 
        + substring(mystring,patindex('%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%',mystring) + 8,9999)
        else mystring end
        from #tmp
    drop table #tmp

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM