如何通过循环SQL Server中的每个记录来检查特定条件?

时间:2016-07-25 13:38:15

标签: sql-server

我有下表

ID  Name 
1   Jagan Mohan Reddy868 
2   Jagan Mohan Reddy869 
3   Jagan Mohan Reddy

名称列大小为VARCHAR(55) 现在,对于其他一些任务,我们只需要10个varchar长度,即VARCHAR(10) 我的要求是在获取Name列值的唯一10位长度之后检查,例如,如果我将ID 1的Name值,即Jagan Mohan Reddy868 SUBSTRING(Name, 0,11),如果它等于另一个行值。在这种情况下,SUBSTRING(Jagan Mohan Reddy868, 0,11)的最终值等于名称为' Jagan Mohan Reddy'的ID 3行的名称值。我需要列出那些行。有人可以帮助我了解如何在SQL Server中实现。

我的主要检查是我的Name列的截断值不应与Name列的任何非截断值匹配。如果是这样,我需要获得这些记录。

4 个答案:

答案 0 :(得分:1)

假设我理解这个问题,我认为你正在寻找这样的事情:

创建并填充示例数据(在将来的问题中将此步骤保存为我们)

DECLARE @T as TABLE
(
    Id int identity(1,1),
    Name varchar(15)
)

INSERT INTO @T VALUES
('Hi, I am Zohar.'),
('Hi, I am Peled.'),
('Hi, I am Z'),
('I''m Zohar peled')

使用带有内部联接的cte来获取与前10个字符匹配的ID列表:

;WITH cte as
(
    SELECT T2.Id As Id1, T1.Id As Id2
    FROM @T T1
    INNER JOIN @T T2 ON LEFT(T1.Name, 10) = t2.Name AND T1.Id <> T2.Id 
)

从原始表中选择记录,内部使用来自cte的Id1和Id2的并集连接:

SELECT T.Id, Name
FROM @T T
INNER JOIN
(
    SELECT Id1 As Id
    FROM CTE 
    UNION
    SELECT Id2 
    FROM CTE
) U ON T.Id = U.Id

结果:

Id          Name
----------- ---------------
1           Hi, I am Zohar.
3           Hi, I am Z

答案 1 :(得分:0)

试试这个

SELECT Id,Name
FROM(
     SELECT *,ROW_NUMBER() OVER(PARTITION BY Name, LEFT(Name,11) ORDER BY ID) RN
     FROM Tbale1 T
    ) Tmp
WHERE Tmp.RN = 1

答案 2 :(得分:0)

遍历列中的所有值,并将substring()函数放在此循环中,我认为在Sql索引中字符串从1开始而不是0.如果将字符串传递给charindex()这个

 CHARINDEX('Y', 'Your String')

因此你会知道它是从0还是1开始 并且您可以将子字符串值保存为长度为10的其他列的值

我希望它能帮到你..

答案 3 :(得分:0)

我认为这应该涵盖您正在寻找的所有案例。

-- Create Table
DECLARE @T as TABLE
(
    Id int identity(1,1),
    Name varchar(55)
)

-- Create Data    
INSERT INTO @T VALUES
('Jagan Mohan Reddy868'),
('Jagan Mohan Reddy869'),
('Jagan Mohan Reddy'),
('Mohan Reddy'),
('Mohan Reddy123551'),
('Mohan R')

-- Get Matching Items
select *, SUBSTRING(name, 0, 11) as ShorterName
from @T 
where SUBSTRING(name, 0, 11) in 
(
    -- get all shortnames with a count > 1
     select SUBSTRING(name, 0, 11) as ShortName 
     from @T   
     group by SUBSTRING(name, 0, 11)
     having COUNT(*) > 1
)
order by Name, LEN(Name)