SQL 语句 字符串取出的问题,想了好久没想出怎么办,请大家帮我看下,谢谢!在 客户表中有如下字段:客户ID 客户代码 客户级别
1 ST 1
2 JY 1
3 ST.01 2
4 ST.02 2
5 ST.01.01 3
6 ST.01.02 3
7 ST.01.01.01 4我想用SQL语句实现如下结果 :
当我选客户级别是 "1 " 的时候 我要把客户代码中的第1 个点前的字符串取出
当我选客户级别是 "2 " 的时候 我要把客户代码中的第 2 个点前的字符串取出
当我选客户级别是 "3 " 的时候 我要把客户代码中的第 3 个点前的字符串取出 要求用SQL 语句
1 ST 1
2 JY 1
3 ST.01 2
4 ST.02 2
5 ST.01.01 3
6 ST.01.02 3
7 ST.01.01.01 4我想用SQL语句实现如下结果 :
当我选客户级别是 "1 " 的时候 我要把客户代码中的第1 个点前的字符串取出
当我选客户级别是 "2 " 的时候 我要把客户代码中的第 2 个点前的字符串取出
当我选客户级别是 "3 " 的时候 我要把客户代码中的第 3 个点前的字符串取出 要求用SQL 语句
如果 LEVEL和.的数量正好一致的话,那怎样做
DECLARE @T TABLE(
ID INT,
CODE VARCHAR(20),
LEV INT
)
INSERT INTO @T
SELECT 1 ,'ST', 1 UNION ALL
SELECT 2 ,'JY', 1 UNION ALL
SELECT 3 ,'ST.01', 2 UNION ALL
SELECT 4 ,'ST.02', 2 UNION ALL
SELECT 5 ,'ST.01.01', 3 UNION ALL
SELECT 6 ,'ST.01.02', 3 UNION ALL
SELECT 7 ,'ST.01.01.01', 4 SELECT *
,REVERSE(RIGHT(REVERSE(CODE),LEN(REVERSE(CODE))-CHARINDEX('.',REVERSE(CODE))))
FROM @T
/*
1 ST 1 ST
2 JY 1 JY
3 ST.01 2 ST
4 ST.02 2 ST
5 ST.01.01 3 ST.01
6 ST.01.02 3 ST.01
7 ST.01.01.01 4 ST.01.01
*/
CREATE FUNCTION F_GetCustCode(@CODE VARCHAR(20), @POS INT)
RETURNS VARCHAR(20)
AS
BEGIN
DECLARE @CNT INT
DECLARE @RESULT VARCHAR(20), @STR VARCHAR(20)
SET @CNT=0
SET @STR=@CODE+'.'
WHILE CHARINDEX('.', @STR)>0
BEGIN
IF @CNT=@POS-1
BEGIN
SET @RESULT=LEFT(@STR,CHARINDEX('.', @STR)-1)
BREAK
END
SET @CNT=@CNT+1
SET @STR=STUFF(@STR,1,CHARINDEX('.',@STR),'')
END
RETURN @RESULT
END
GODECLARE @TB TABLE([客户ID] INT, [客户代码] VARCHAR(11), [客户级别] INT)
INSERT @TB
SELECT 1, 'ST', 1 UNION ALL
SELECT 2, 'JY', 1 UNION ALL
SELECT 3, 'ST.01', 2 UNION ALL
SELECT 4, 'ST.02', 2 UNION ALL
SELECT 5, 'ST.01.01', 3 UNION ALL
SELECT 6, 'ST.01.02', 3 UNION ALL
SELECT 7, 'ST.01.01.01', 4SELECT *,dbo.F_GetCustCode(客户代码,客户级别) AS 级别
FROM @TBDROP FUNCTION F_GetCustCode/*客户ID 客户代码 客户级别 级别
----------- ----------- ----------- --------------------
1 ST 1 ST
2 JY 1 JY
3 ST.01 2 01
4 ST.02 2 02
5 ST.01.01 3 01
6 ST.01.02 3 02
7 ST.01.01.01 4 01
*/
如过我要:
SELECT *
,REVERSE(RIGHT(REVERSE(CODE),LEN(REVERSE(CODE))-CHARINDEX('.',REVERSE(CODE))))
FROM @T WHERE LEV>=2 中的 CODE 结果是如下:
3 ST.01 2 ST
4 ST.02 2 ST
5 ST.01.01 3 ST.01
6 ST.01.02 3 ST.01
7 ST.01.01.01 4 ST.01 怎么写,谢谢
上面我讲错了
guguda2008:您好,谢谢您,
如过我要:
SELECT *
FROM @T WHERE LEV>=2 中的 CODE 结果是如下:
3 ST.01 2 ST.01
4 ST.02 2 ST.02
5 ST.01.01 3 ST.01
6 ST.01.02 3 ST.01
7 ST.01.01.01 4 ST.01怎么写,谢谢
FROM @TBDROP FUNCTION F_GetCustCode
得到的结果是
/*客户ID 客户代码 客户级别 级别
----------- ----------- ----------- --------------------
1 ST 1 ST
2 JY 1 JY
3 ST.01 2 ST.01
4 ST.02 2 ST.02
5 ST.01.01 3 ST.01
6 ST.01.02 3 ST.01
7 ST.01.01.01 4 ST.01
*/如果 客户级别参数是 1 结果是如下:客户ID 客户代码 客户级别 级别
----------- ----------- ----------- --------------------
1 ST 1 ST
2 JY 1 JY
3 ST.01 2 ST
4 ST.02 2 ST
5 ST.01.01 3 ST
6 ST.01.02 3 ST
7 ST.01.01.01 4 ST 如果 客户级别参数是 3 结果是如下:客户ID 客户代码 客户级别 级别
----------- ----------- ----------- --------------------
1 ST 1 ST
2 JY 1 JY
3 ST.01 2 ST.01
4 ST.02 2 ST.025 ST.01.01 3 ST.01.01
6 ST.01.02 3 ST.01.02
7 ST.01.01.01 4 ST.01.01
*/
RETURNS VARCHAR(20)
AS
BEGIN
DECLARE @CNT INT
DECLARE @RESULT VARCHAR(20), @STR VARCHAR(20)
SET @CNT=0
SET @STR=@CODE+'.'
SET @RESULT=''
WHILE CHARINDEX('.', @STR)>0
BEGIN
SET @RESULT=@RESULT+LEFT(@STR,CHARINDEX('.', @STR))
SET @CNT=@CNT+1
IF @CNT=@POS
BREAK
SET @STR=STUFF(@STR,1,CHARINDEX('.',@STR),'')
END
RETURN LEFT(@RESULT,LEN(@RESULT)-1)
END
GODECLARE @TB TABLE([客户ID] INT, [客户代码] VARCHAR(11), [客户级别] INT)
INSERT @TB
SELECT 1, 'ST', 1 UNION ALL
SELECT 2, 'JY', 1 UNION ALL
SELECT 3, 'ST.01', 2 UNION ALL
SELECT 4, 'ST.02', 2 UNION ALL
SELECT 5, 'ST.01.01', 3 UNION ALL
SELECT 6, 'ST.01.02', 3 UNION ALL
SELECT 7, 'ST.01.01.01', 4SELECT *,dbo.F_GetCustCode(客户代码,3) AS 级别
FROM @TBDROP FUNCTION F_GetCustCode
/*
客户ID 客户代码 客户级别 级别
----------- ----------- ----------- --------------------
1 ST 1 ST
2 JY 1 JY
3 ST.01 2 ST.01
4 ST.02 2 ST.02
5 ST.01.01 3 ST.01.01
6 ST.01.02 3 ST.01.02
7 ST.01.01.01 4 ST.01.01
*/