none
查找同一个字段中前3个字符相同的所有行 RRS feed

  • 问题

  • 一个字段中有些数据前3个字符相同,后面可能不同,怎样找出所有这种数据呢?

    例如表A:

    ID       number    name

    1          001         gzs_12k

    2          002         gzs_8h

    3          001         szs_12k

    4          002         szs_9k

    5          001         shs_16k

    6          001         bjs_18k

    需要的结果:

    ID       number    name

    1          001         gzs_12k

    2          002         gzs_8h

    3          001         szs_12k

    4          002         szs_9k

    感谢!

    2016年7月12日 10:17

答案

  • CREATE TABLE ttprefix(id INT IDENTITY(1,1),number INT,NAME NVARCHAR(200))


    INSERT INTO [dbo].[ttprefix]
            ( [number], [NAME] )
    SELECT 001,'gzs_12k' UNION ALL
    SELECT 002,'gzs_8h' UNION ALL
    SELECT 001,'szs_12k' UNION ALL
    SELECT 002,'szs_9k' UNION ALL
    SELECT 001,'shs_16k' UNION ALL
    SELECT 001,'bjs_18k'

    SELECT  tpa.[id] ,
            [tpa].[number] ,
            [tpa].[NAME]
    FROM    [dbo].[ttprefix] tpa
            JOIN [dbo].[ttprefix] tpb ON SUBSTRING([tpa].[NAME], 0,
                                                   CHARINDEX('_', [tpa].[NAME], 0)) = SUBSTRING([tpb].[NAME],
                                                                  0,
                                                                  CHARINDEX('_',
                                                                  [tpb].[NAME], 0))
                                         AND [tpb].[id] <> [tpa].[id]

    Love SQL

    • 已标记为答案 kZhj 2016年7月13日 6:07
    2016年7月12日 11:43
  • 前3个就截取一下做比较就行了

    select * from tb a

    where exists( select * from tb b where left(a.name,3)=left(b.name,3) and a.id<>b.id)

    • 已标记为答案 kZhj 2016年7月13日 6:07
    2016年7月12日 12:29

全部回复

  • CREATE TABLE ttprefix(id INT IDENTITY(1,1),number INT,NAME NVARCHAR(200))


    INSERT INTO [dbo].[ttprefix]
            ( [number], [NAME] )
    SELECT 001,'gzs_12k' UNION ALL
    SELECT 002,'gzs_8h' UNION ALL
    SELECT 001,'szs_12k' UNION ALL
    SELECT 002,'szs_9k' UNION ALL
    SELECT 001,'shs_16k' UNION ALL
    SELECT 001,'bjs_18k'

    SELECT  tpa.[id] ,
            [tpa].[number] ,
            [tpa].[NAME]
    FROM    [dbo].[ttprefix] tpa
            JOIN [dbo].[ttprefix] tpb ON SUBSTRING([tpa].[NAME], 0,
                                                   CHARINDEX('_', [tpa].[NAME], 0)) = SUBSTRING([tpb].[NAME],
                                                                  0,
                                                                  CHARINDEX('_',
                                                                  [tpb].[NAME], 0))
                                         AND [tpb].[id] <> [tpa].[id]

    Love SQL

    • 已标记为答案 kZhj 2016年7月13日 6:07
    2016年7月12日 11:43
  • 前3个就截取一下做比较就行了

    select * from tb a

    where exists( select * from tb b where left(a.name,3)=left(b.name,3) and a.id<>b.id)

    • 已标记为答案 kZhj 2016年7月13日 6:07
    2016年7月12日 12:29
  • Select a.*

     From tb a

             JOIN (Select LEFT(Name,3) as Name,COUNT(*) as CNT

                         From tb GROUP BY LEFT(Name,3) HAVING COUNT(*)>1) t ON LEFT(a.Name,3)=t.Name


    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com

    2016年8月22日 2:47