SQL字符处理

一:取字符串中出现的首个数字是5的那些记录

比如 ZCB520,ZCB888,520ZCB,

ZCB888就是需要被过滤的。

 

select colName,  patindex('%[0-9]%',colName) 首个数字出现的位置 from TableName
where substring(colName,patindex('%[0-9]%',colName),1)='5' 
 

 

如果想要返回首个非数字出现的位置就用:patindex('%[^0-9]%',colName)

PATINDE函数说明。

 

语法  PATINDEX (<’%substring _expression%’>, <column_ name>)

        其中子串表达式前后必须有百分号“%”否则返回值为0.

         这个函数从<column_ name>列中去查找<’%substring _expression%’>表达式指定的字符串,并返回该字符串首次在column_ name出现的位置。

 

二:在大写字母前插入空格

 

Id value
  1 HelloWorld
  2 NewArrivalsCareerClothing
  3 CheckbookCoversCheckbookCovers
  要更新成:
  1 Hello World
  2 New Arrivals Career Clothing
  3 Checkbook Covers Checkbook Covers

解决方案一:

create table tb(id int,[value] varchar(100))
insert into tb
select 1,'HelloWorld' union all
select 2,'NewArrivalsCareerClothing' union all
select 3,'CheckbookCoversCheckbookCovers' union all
select 4,'WTO'
go

create function f_change(@a varchar(100))
returns varchar(100)
as
begin
declare @len int
declare @int int
declare @str varchar(100)
set @str = ''
set @len = len(@a)
set @int = 1
while @int <= @len
    begin
        if (ascii(substring(@a,@int,1)) between 66 and 96)
        begin
            set @str = @str + ' ' + substring(@a,@int,1)
        end
        else
        begin
            set @str = @str + substring(@a,@int,1)
        end
        set @int = @int + 1
    end
return stuff(@str,1,1,'')
end
go

select * from tb
select id,dbo.f_change([value]),[value] from tb

drop table tb
drop function f_change

 

解决方案二:

 

EXEC sp_configure 'show advanced options', 1
RECONFIGURE

EXEC sp_configure 'Ole Automation Procedures', 1
RECONFIGURE


--以下是我以前写的利用正则表达式替换字符串的函数
IF OBJECT_ID(N'dbo.RegexReplace') IS NOT NULL 
    DROP FUNCTION dbo.RegexReplace
GO

CREATE FUNCTION dbo.RegexReplace
(
    @string VARCHAR(MAX),    --被替换的字符串
    @pattern VARCHAR(255),    --替换模板
    @replacestr VARCHAR(255),    --替换后的字符串
    @IgnoreCase INT = 0    --0区分大小写 1不区分大小写
)
RETURNS VARCHAR(MAX)
AS 
BEGIN
    DECLARE @objRegex INT, @retstr VARCHAR(8000)

    --创建对象
    EXEC sp_OACreate 'VBScript.RegExp', @objRegex OUT

    --设置属性
    EXEC sp_OASetProperty @objRegex, 'Pattern', @pattern
    EXEC sp_OASetProperty @objRegex, 'IgnoreCase', @IgnoreCase
    EXEC sp_OASetProperty @objRegex, 'Global', 1

    --执行
    EXEC sp_OAMethod @objRegex, 'Replace', @retstr OUT, @string, @replacestr

    --释放
    EXECUTE sp_OADestroy @objRegex

    RETURN @retstr
END
GO

--针对这里,可以:
SELECT dbo.RegexReplace([value],'[A-Z]',' $&',0) from tb

 

如果一个字符串中出现WTO,UFO这样的字,第一种方案的判断会很麻烦,而第二种只要改成

SELECT  dbo.RegexReplace('HelloWorldUFO', '([a-z])([A-Z])', '$1 $2',0)就可以了。

(该示例取处CSDN:http://topic.csdn.net/u/20110127/10/47c2d7ea-7878-4de0-bc29-ae9654cec894.html)

你可能感兴趣的:(sql,正则表达式,F#,VBScript,Go)