我有下表
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列的任何非截断值匹配。如果是这样,我需要获得这些记录。
答案 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)