昨晚花了半小时,写了个验证中国身份证的正则表达式。目前觉得还是比较满意的。比较严谨,绝对原创。
^\d{6}(19|20)\d{2}([0][1-9]|11|12)([0,1,2][1-9]|[3][0,1])\d{3}([0-9]|X|x)$
MSSQL 数据库中没有Split 函数,有时候我们需要在数据库中解析类似于 A,B,C,D 这样有规则的分隔符的字符串。
可以写个自定义Split 表值函数:
---- =============================================
---- Author: hooyes
---- Create date: 2013-07-05
---- Update date: 2013-07-05
---- Description: 字符串分割函数
---- =============================================
CREATE FUNCTION [dbo].[split]
(
@Str VARCHAR(8000) ,
@Separator VARCHAR(10)
)
RETURNS @returntable TABLE
(
id INT IDENTITY(1, 1) ,
value VARCHAR(500)
)
AS
BEGIN
DECLARE @i INT
SET @Str = RTRIM(LTRIM(@Str))
SET @i = CHARINDEX(@Separator, @Str)
WHILE @i >= 1
BEGIN
INSERT @returntable
VALUES ( LEFT(@Str, @i - 1) )
SET @Str = SUBSTRING(@Str, @i + 1, LEN(@Str) - @i)
SET @i = CHARINDEX(@Separator, @Str)
END
IF @Str <> '\'
BEGIN
INSERT @returntable
VALUES ( @Str )
END
RETURN
END
在数据库中创建完这个自定义的表值函数后,我们就可以使用啦。
SELECT *
FROM dbo.split('apple,banana,coco,hooyes', ',')
-- result
/*
id value
----------- -----------------------
1 apple
2 banana
3 coco
4 hooyes
*/
SELECT id ,
value
FROM dbo.split('apple;banana;coco;hooyes', ';')
WHERE value = 'hooyes'
-- result
/*
id value
----------- --------------------------
4 hooyes
*/
2018年11月29日 更新:
从SQL Server 2016版本起,数据库开始内置了STRING_SPLIT函数,终于内置了字符串分割函数,使用方法跟我写的函数一样。
语法如下:
STRING_SPLIT ( string , separator )
分隔符可以自定义,可用逗号也可用空格例如:
SELECT value FROM STRING_SPLIT('apple banana coco hooyes', ' ');
更多关于STRING_SPLIT的介绍请查看docs.microsoft.com
今天同事向我咨询一个SQL问题,假如,有如下数据表,需求是只消除连续的重复行。
如下数据(表名为 Hooyes, id 是连续的 ),
id 0,1 的number (111) 连续的重复了,只保留一行,id 7,8 的number(111) 也连续重复了,也只保留一行。依此类推。 要求得到的结果如下: