博客好久沒更新了。公司事情多,所以很多時間給用在公司的事情上了。從進公司到現在,確確實實遇到很多的問題。后期一定會和大家多多分享。
先從最近的一件事情說起,公司信息管理部門,需要我統計一份用戶真實姓名(User.TrueName)的數據,按如下方式統計。
1、 中文 數量
2、 英文 數量
3、 中文+英文 數量
4、 數字 數量
5、 數字+英文或+中文 數量
SQL Server 有通配符和正則兩種方式,通配符匹配的關系一般都很簡單。而正則可以解決大部分的問題。對於上面一種統計,我是按最基本的SQL寫法來的。

USE SCM
DECLARE @index INT , @End INT, @TrueName NVARCHAR( 20), @UserID INT, @t_UserID INT, @CharLength INT
DECLARE @Digit INT, @Letter INT , @Hanzi INT, @LetterAndHanzi INT, @DigitAndLetterOrHanzi INT
SET @index = 0
SET @UserID = 0
SET @t_UserID = 0
SET @CharLength = 0
SET @Digit = 0
SET @Letter = 0
SET @Hanzi = 0
SET @LetterAndHanzi = 0
SET @DigitAndLetterOrHanzi = 0
SELECT @End = COUNT( 1) FROM Users(NOLOCK) u WHERE u.TrueName <> ''
WHILE( @index < @End)
BEGIN
DECLARE @LetterChar CHAR( 2), @LetterIndex INT, @TempChar NVARCHAR( 20)
DECLARE @t_Digit INT, @t_Letter INT , @t_Hanzi INT
SET @LetterIndex = 1
SET @LetterChar = ''
SET @TempChar = ''
SET @t_Digit = 0
SET @t_Letter = 0
SET @t_Hanzi = 0
SELECT TOP 1 @TrueName =u.TrueName, @t_UserID =u.UserID FROM Users(nolock) u WHERE
u.TrueName <> '' AND u.UserID > @UserID ORDER BY u.UserID
IF( @TrueName <> '')
BEGIN
-- PRINT @TrueName+'--------'+CAST(@t_UserID AS varchar)
-- PRINT '@@'+CAST(@index AS VARCHAR)
SET @CharLength = LEN( @TrueName)
-- WHERE
IF( @CharLength > 0)
BEGIN
WHILE( @LetterIndex <= @CharLength)
BEGIN
SET @LetterChar = SUBSTRING( @TrueName, @LetterIndex, 1)
-- SET @TempChar = @TempChar+@LetterChar+'-'
-- 分析單個字符
DECLARE @Unicode INT
SET @Unicode = UNICODE( @LetterChar)
SET @LetterIndex = @LetterIndex + 1
IF @Unicode BETWEEN 48 AND 57
BEGIN
-- 數字
SET @t_Digit = @t_Digit + 1
CONTINUE
END
IF @Unicode BETWEEN 65 AND 90
BEGIN
-- 字母
SET @t_Letter = @t_Letter + 1
CONTINUE
END
IF @Unicode BETWEEN 97 AND 122
BEGIN
-- 字母
SET @t_Letter = @t_Letter + 1
CONTINUE
END
IF @Unicode > 127
BEGIN
-- 漢字
SET @t_Hanzi = @t_Hanzi + 1
CONTINUE
END
END
-- PRINT CAST(@t_UserID AS varchar)+'-->'+@TrueName+'-->'+@TempChar
END
IF @t_Digit = @CharLength
BEGIN
SET @Digit = @Digit + 1
END
IF @t_Letter = @CharLength
BEGIN
-- PRINT @TrueName +'-->>' + CAST(@CharLength AS VARCHAR)
SET @Letter = @Letter + 1
END
IF @t_Hanzi = @CharLength
BEGIN
SET @Hanzi = @Hanzi + 1
END
IF ( @t_Letter <> 0 AND @t_Hanzi <> 0) AND @t_Letter + @t_Hanzi = @CharLength
BEGIN
SET @LetterAndHanzi = @LetterAndHanzi + 1
END
IF ( ( @t_Digit <> 0 AND @t_Letter <> 0) AND ( @t_Digit + @t_Letter = @CharLength )) OR ( ( @t_Digit <> 0 AND @t_Hanzi <> 0) AND ( @t_Digit + @t_Hanzi = @CharLength) ) OR ( ( @t_Digit <> 0 AND @t_Letter <> 0 AND @t_Hanzi <> 0 ) AND ( @t_Digit + @t_Letter + @t_Hanzi = @CharLength))
BEGIN
SET @DigitAndLetterOrHanzi = @DigitAndLetterOrHanzi + 1
END
SET @CharLength = 0
SET @TempChar = ''
SET @t_Digit = 0
SET @t_Letter = 0
SET @t_Hanzi = 0
END
SET @index = @index + 1
SET @UserID = @t_UserID
END
PRINT ' 中文: ' + cast( @Hanzi as VARCHAR)
PRINT ' 英文: ' + cast( @Letter as VARCHAR)
PRINT ' 中文+英文: ' + cast( @LetterAndHanzi as VARCHAR)
PRINT ' 數字: ' + cast( @Digit as VARCHAR)
PRINT ' 數字+英文或+中文: ' + cast( @DigitAndLetterOrHanzi as varchar)
DECLARE @index INT , @End INT, @TrueName NVARCHAR( 20), @UserID INT, @t_UserID INT, @CharLength INT
DECLARE @Digit INT, @Letter INT , @Hanzi INT, @LetterAndHanzi INT, @DigitAndLetterOrHanzi INT
SET @index = 0
SET @UserID = 0
SET @t_UserID = 0
SET @CharLength = 0
SET @Digit = 0
SET @Letter = 0
SET @Hanzi = 0
SET @LetterAndHanzi = 0
SET @DigitAndLetterOrHanzi = 0
SELECT @End = COUNT( 1) FROM Users(NOLOCK) u WHERE u.TrueName <> ''
WHILE( @index < @End)
BEGIN
DECLARE @LetterChar CHAR( 2), @LetterIndex INT, @TempChar NVARCHAR( 20)
DECLARE @t_Digit INT, @t_Letter INT , @t_Hanzi INT
SET @LetterIndex = 1
SET @LetterChar = ''
SET @TempChar = ''
SET @t_Digit = 0
SET @t_Letter = 0
SET @t_Hanzi = 0
SELECT TOP 1 @TrueName =u.TrueName, @t_UserID =u.UserID FROM Users(nolock) u WHERE
u.TrueName <> '' AND u.UserID > @UserID ORDER BY u.UserID
IF( @TrueName <> '')
BEGIN
-- PRINT @TrueName+'--------'+CAST(@t_UserID AS varchar)
-- PRINT '@@'+CAST(@index AS VARCHAR)
SET @CharLength = LEN( @TrueName)
-- WHERE
IF( @CharLength > 0)
BEGIN
WHILE( @LetterIndex <= @CharLength)
BEGIN
SET @LetterChar = SUBSTRING( @TrueName, @LetterIndex, 1)
-- SET @TempChar = @TempChar+@LetterChar+'-'
-- 分析單個字符
DECLARE @Unicode INT
SET @Unicode = UNICODE( @LetterChar)
SET @LetterIndex = @LetterIndex + 1
IF @Unicode BETWEEN 48 AND 57
BEGIN
-- 數字
SET @t_Digit = @t_Digit + 1
CONTINUE
END
IF @Unicode BETWEEN 65 AND 90
BEGIN
-- 字母
SET @t_Letter = @t_Letter + 1
CONTINUE
END
IF @Unicode BETWEEN 97 AND 122
BEGIN
-- 字母
SET @t_Letter = @t_Letter + 1
CONTINUE
END
IF @Unicode > 127
BEGIN
-- 漢字
SET @t_Hanzi = @t_Hanzi + 1
CONTINUE
END
END
-- PRINT CAST(@t_UserID AS varchar)+'-->'+@TrueName+'-->'+@TempChar
END
IF @t_Digit = @CharLength
BEGIN
SET @Digit = @Digit + 1
END
IF @t_Letter = @CharLength
BEGIN
-- PRINT @TrueName +'-->>' + CAST(@CharLength AS VARCHAR)
SET @Letter = @Letter + 1
END
IF @t_Hanzi = @CharLength
BEGIN
SET @Hanzi = @Hanzi + 1
END
IF ( @t_Letter <> 0 AND @t_Hanzi <> 0) AND @t_Letter + @t_Hanzi = @CharLength
BEGIN
SET @LetterAndHanzi = @LetterAndHanzi + 1
END
IF ( ( @t_Digit <> 0 AND @t_Letter <> 0) AND ( @t_Digit + @t_Letter = @CharLength )) OR ( ( @t_Digit <> 0 AND @t_Hanzi <> 0) AND ( @t_Digit + @t_Hanzi = @CharLength) ) OR ( ( @t_Digit <> 0 AND @t_Letter <> 0 AND @t_Hanzi <> 0 ) AND ( @t_Digit + @t_Letter + @t_Hanzi = @CharLength))
BEGIN
SET @DigitAndLetterOrHanzi = @DigitAndLetterOrHanzi + 1
END
SET @CharLength = 0
SET @TempChar = ''
SET @t_Digit = 0
SET @t_Letter = 0
SET @t_Hanzi = 0
END
SET @index = @index + 1
SET @UserID = @t_UserID
END
PRINT ' 中文: ' + cast( @Hanzi as VARCHAR)
PRINT ' 英文: ' + cast( @Letter as VARCHAR)
PRINT ' 中文+英文: ' + cast( @LetterAndHanzi as VARCHAR)
PRINT ' 數字: ' + cast( @Digit as VARCHAR)
PRINT ' 數字+英文或+中文: ' + cast( @DigitAndLetterOrHanzi as varchar)