我有下面的桌子
ID Name
1 Jagan Mohan Reddy868
2 Jagan Mohan Reddy869
3 Jagan Mohan Reddy名称列大小为VARCHAR(55)。
现在,对于其他一些任务,我们只需要10个varchar长度,即VARCHAR(10)。
我的要求是检查在仅取名称列值的10位长度之后,例如,如果我取ID为1的名称值,即,如果它等于另一个行值,则Jagan Mohan Reddy868 by SUBSTRING(Name, 0,11)。这里,在本例中,SUBSTRING(Jagan Mohan Reddy868, 0,11)的最终值等于ID3行的name值,该行的名称是'Jagan Mohan Reddy‘。我需要把那些好心的行列出来。有没有人能帮我讲讲如何在SQL Server中实现。
我的主要检查是我的Name列的截断值不应该与Name列的任何非截断值匹配。如果是这样,我需要拿到那些记录。
发布于 2016-07-25 21:57:38
假设我理解了这个问题,我想你正在寻找的东西是这样的:
创建并填充示例数据(请在将来的问题中保存此步骤)。
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个字符匹配的ids列表:
;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发布于 2016-07-25 21:59:49
尝尝这个
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发布于 2016-07-25 22:08:13
循环遍历所有值的列,并将substring()函数放入此循环中,我认为在Sql中,字符串的索引从1而不是0开始。如果将字符串传递给charindex(),如下所示
CHARINDEX('Y', 'Your String')这样你就会知道它是从0还是1开始,你可以将你的子字符串的值保存为长度为10的其他列的值
我希望它能帮助你..
https://stackoverflow.com/questions/38569301
复制相似问题