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.   

    如果LEVEL和.的数量正好一致一话就好做了
      

  2.   

    guguda2008:您好,用自定义函数怎么做?
    如果 LEVEL和.的数量正好一致的话,那怎样做
      

  3.   

    guguda2008:您好,请把方法贴出来看看
      

  4.   


    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
    */
      

  5.   


    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
    */
      

  6.   

    guguda2008:您好,谢谢您,
     如过我要:
    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 怎么写,谢谢
      

  7.   


    上面我讲错了
    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怎么写,谢谢
      

  8.   

    用自定义函数好了,参见13Lcsdyyr哥的
      

  9.   

    csdyyr:您好,谢谢您,我上面没表达清楚,对不起,我想的结果是如果 客户级别参数是  2SELECT *,dbo.F_GetCustCode(客户代码,2) 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
    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
    */
      

  10.   

    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+'.'
       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
    */
      

  11.   

    csdyyr:您好,在茫茫网海中我能遇见您,而且能得到您的帮助,我很幸运,祝您万事如意,好人好梦!