2016-07-25 2 views
0

У меня есть следующие таблицыКак проверить конкретное условие, перебирая каждую запись в SQL Server?

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, SUBSTRING(Name, 0,11), если оно равно другому значению строки. здесь в этом случае конечное значение SUBSTRING(Jagan Mohan Reddy868, 0,11) равно значению имени строки ID 3, имя которой «Jagan Mohan Reddy». Мне нужно составить список этих строк. Может кто-нибудь помочь мне в том, как я могу достичь в SQL Server.

Моя основная проверка заключается в том, что усеченные значения столбца «Имя» не должны совпадать с любыми не усеченными значениями столбца «Имя». Если так, мне нужно получить эти записи.

+0

Непонятный вопрос. Я могу с уверенностью сказать, что у вас нет этих значений в столбце varchar (15). Написано 20 персонажей. Теперь, если вы ищете только первые 10 символов, почему 1 и 3 совпадают, но не 2? Возможно, вы могли бы сделать это с помощью самостоятельного присоединения, но просто не совсем понятно, что вы пытаетесь сделать. Эта статья может помочь вам начать работу. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

Данные вашего образца не вписываются в varchar (15), самый длинный строки у вас есть 20 символов в длину ... –

ответ

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 символам:

;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 
) 

записи из исходной таблицы, внутренний вместе с объединением в 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 
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 
0

петлю над столбцом на все значения и положите вашу функцию substring() внутри этого цикла, и я думаю, что в индексе Sql строка начинается с 1 вместо 0. Если вы передаете свою строку charindex(), как это

CHARINDEX('Y', 'Your String') 

, таким образом, вы узнаете, является ли это, начиная с 0 или 1 и вы можете сохранить значение подстроки в качестве значения другого столбца с длиной 10

Я надеюсь, что это поможет ..

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) 
+0

Это также охватывает матчи, где 2 разных названия будут сокращены до того же значения. – momar

Смежные вопросы