Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Вопрос по сравнению строк  [new]
Durex_
Member

Откуда:
Сообщений: 79
Здравствуйте.
Прошу помочь в следующем вопросе.

В таблице, по мимо других полей есть поле nvarchar(255) - адрес доставки. В таблице 16 млн записей. Они сливались из разных баз данных и, могли задвоиться-затроиться или зачетвериться легко. Но, это уже не важно, потому как досталось мне в таком виде.

Мне надо понять, почему SELECT DISTINCT [Адрес доставки] FROM MyTable выдает мне визуально одинаковые строки с адресами.
Пытаюсь понять почему такое происходит. Присваиваю значения переменным и пытаюсь сравнить с помощью IF - выдает, что идентичные. Пытаюсь разложить на символы и посмотреть ASCII коды - цифры и символы показывает нормально, а русские буквы - вопросительные знаки.

Что я делаю не так сравнивая строки посимвольно? Почему вопросительные знаки?

declare @t1 Nvarchar(255) = '443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер А, 2 этаж, к. №323'
declare @t2 Nvarchar(255) = '443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер А, 2 этаж, к. №323'
declare @i int = 1

create table #symbols (t1 NVARCHAR(1),
					  t1_code int,
					  t2 NVARCHAR(1),
					  t2_code int)

					  
while @i<=255
begin
	INSERT INTO #symbols select substring(@t1,@i,1), ascii(substring(@t1,@i,1)),substring(@t2,@i,1), ascii(substring(@t2,@i,1)) 
	set @i=@i+1
end
SELECT * FROM #symbols
DROP TABLE #symbols


В коде - строки с адресом - это скопированные строки из результата запроса SELECT DISTINCT [Адрес доставки] FROM MY table

Заранее благодарю за ответы. Сильно не пинайте если туплю.
18 авг 14, 12:26    [16455055]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
Glory
Member

Откуда:
Сообщений: 104751
Durex_
Что я делаю не так сравнивая строки посимвольно? Почему вопросительные знаки?

Потому что уникодовские символьные константы выглядят так
N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер А, 2 этаж, к. №323'
18 авг 14, 12:30    [16455089]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Durex_
Почему вопросительные знаки?
Юникод - не надо забывать ставить перед литеральными строками букву N
18 авг 14, 12:31    [16455096]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
Glory
Member

Откуда:
Сообщений: 104751
И для визульного сравнения сконвертируйте ваши строки в binary
18 авг 14, 12:31    [16455098]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
Durex_
Member

Откуда:
Сообщений: 79
iap
Durex_
Почему вопросительные знаки?
Юникод - не надо забывать ставить перед литеральными строками букву N


О! Точно! Спасибо! Поправил, вопросительные знаки сталивыглядеть -русскими буквами. Но, вопрос это не решило. Все равно выходит, что одинаковые строки, а DISTINCT упорно считает их разными.
18 авг 14, 12:35    [16455138]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
какой такой DISTINCT?
18 авг 14, 12:36    [16455150]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
Glory
Member

Откуда:
Сообщений: 104751
Durex_
се равно выходит, что одинаковые строки, а DISTINCT упорно считает их разными.

Это вам кажется
Например русская А очень похожа на английскую A
18 авг 14, 12:37    [16455160]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
group by сделайте с count() посмотрите, что у вас там реально в таблице адресов
18 авг 14, 12:38    [16455171]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
Durex_
Member

Откуда:
Сообщений: 79
Glory
И для визульного сравнения сконвертируйте ваши строки в binary


сконвертировал

declare @t1 Nvarchar(255) = N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер А, 2 этаж, к. №323'
declare @t2 Nvarchar(255) = N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер А, 2 этаж, к. №323'

if cast(@t1 as binary) = cast(@t2 as binary)
  print 'ok'


все равно одинаковые... (((
18 авг 14, 12:40    [16455200]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
Glory
Member

Откуда:
Сообщений: 104751
Durex_
все равно одинаковые... (((

А где здесь DISTINCT ?
18 авг 14, 12:42    [16455225]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
SELECT  
    T.[Адрес доставки],
    Count(*) as [Кол-во] 
FROM MYtable T
GROUP BY T.[Адрес доставки] 


вот это посмотрите сначала, увидите какие у вас реально расклады по строкам
18 авг 14, 12:43    [16455230]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
Glory
Member

Откуда:
Сообщений: 104751
declare @t1 Nvarchar(255) = N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер А, 2 этаж, к. №323'
declare @t2 Nvarchar(255) = N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер А, 2 этаж, к. №323'
select distinct f1 from
(select @t1 as f1 union all select @t2) a
18 авг 14, 12:44    [16455238]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Обычно жёсткий пробел CHAR(0xA0) ставят вместо обычного CHAR(0x20).
Может, с переводом строки и каретки проблемы.
И ещё много чего...
18 авг 14, 12:57    [16455386]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
Durex_
Member

Откуда:
Сообщений: 79
[quot Konst_One]
SELECT  
    T.[Адрес доставки],
    Count(*) as [Кол-во] 
FROM MYtable T
GROUP BY T.[Адрес доставки] 


Посмотрел.

К сообщению приложен файл. Размер - 134Kb
18 авг 14, 13:13    [16455604]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
declare @t1 Nvarchar(255) = N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер А, 2 этаж, к. №323'
declare @t2 Nvarchar(255) = N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер А, 2 этаж, к. №323'

SELECT V.number,SUBSTRING(@t1,V.number,1),SUBSTRING(@t2,V.number,1)
FROM master.dbo.spt_values V
WHERE SUBSTRING(@t1,V.number,1)<>SUBSTRING(@t2,V.number,1)
ORDER BY V.number;


number           
----------- ---- ----

Повторите со своими строками у себя.
18 авг 14, 13:18    [16455672]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
declare @t1 Nvarchar(255) = N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер А, 2 этаж, к. №323'
declare @t2 Nvarchar(255) = N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер А, 2 этаж, к. №323'

SELECT V.number,SUBSTRING(@t1,V.number,1),SUBSTRING(@t2,V.number,1)
FROM master.dbo.spt_values V
WHERE SUBSTRING(@t1,V.number,1)<>SUBSTRING(@t2,V.number,1)
ORDER BY V.number;



number           
----------- ---- ----
Повторите со своими строками у себя.
Надо поправиться :
declare @t1 Nvarchar(255) = N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер А, 2 этаж, к. №323'
declare @t2 Nvarchar(255) = N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер А, 2 этаж, к. №323'

SELECT V.number,SUBSTRING(@t1,V.number,1),SUBSTRING(@t2,V.number,1)
FROM master.dbo.spt_values V
WHERE V.type='P' AND SUBSTRING(@t1,V.number,1)<>SUBSTRING(@t2,V.number,1)
ORDER BY V.number;
18 авг 14, 13:46    [16455979]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
Durex_
Member

Откуда:
Сообщений: 79
iap
iap
declare @t1 Nvarchar(255) = N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер А, 2 этаж, к. №323'
declare @t2 Nvarchar(255) = N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер А, 2 этаж, к. №323'

SELECT V.number,SUBSTRING(@t1,V.number,1),SUBSTRING(@t2,V.number,1)
FROM master.dbo.spt_values V
WHERE SUBSTRING(@t1,V.number,1)<>SUBSTRING(@t2,V.number,1)
ORDER BY V.number;



number           
----------- ---- ----
Повторите со своими строками у себя.
Надо поправиться :
declare @t1 Nvarchar(255) = N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер А, 2 этаж, к. №323'
declare @t2 Nvarchar(255) = N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер А, 2 этаж, к. №323'

SELECT V.number,SUBSTRING(@t1,V.number,1),SUBSTRING(@t2,V.number,1)
FROM master.dbo.spt_values V
WHERE V.type='P' AND SUBSTRING(@t1,V.number,1)<>SUBSTRING(@t2,V.number,1)
ORDER BY V.number;


Пустая выборка. о чем это может говорить?
18 авг 14, 13:50    [16456019]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
Durex_
Member

Откуда:
Сообщений: 79
iap,
0 записей.
18 авг 14, 13:52    [16456031]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
Glory
Member

Откуда:
Сообщений: 104751
declare @t1 Nvarchar(255) = N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер А, 2 этаж, к. №323'
declare @t2 Nvarchar(255) = N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер A, 2 этаж, к. №323'
declare @t3 Nvarchar(255) = N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер'+CHAR(13)+N'A, 2 этаж, к. №323'
select distinct f1 from
(select @t1 as f1 union all select @t2 union all select @t3) a
18 авг 14, 13:56    [16456065]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
SELECT
A.[Адрес доставки],
A.[Кол-во],
DATALENGTH(A.[Адрес доставки]) as [Длина данных]
FROM
(
SELECT
T.[Адрес доставки],
Count(*) as [Кол-во]
FROM MYtable T
WHERE T.[Адрес доставки] LIKE '%323'
GROUP BY T.[Адрес доставки]
) A

вот это выведите в тестовый файл прям из SSMS (кнопочка на тулбаре есть такая) и сравните поле с адресом в нормальном текстовом редакторе посимвольно, например в Notepad++
18 авг 14, 13:57    [16456075]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Durex_
iap,
0 записей.
Все символы строк равны между собой.
Но я подумал: а вдруг одна строка длиннее другой?
Сравните DATALENGTH(@t1) и DATALENGTH(@t2)
18 авг 14, 13:57    [16456076]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Durex_
Пустая выборка. о чем это может говорить?
О том, что нужно проверять данные в таблицах, а не те, что вы накопипастили.
18 авг 14, 13:58    [16456082]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
Durex_
Member

Откуда:
Сообщений: 79
Glory
declare @t1 Nvarchar(255) = N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер А, 2 этаж, к. №323'
declare @t2 Nvarchar(255) = N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер A, 2 этаж, к. №323'
declare @t3 Nvarchar(255) = N'443028, Самарская область, г. Самара, Красноглинский район, 24 км. Московского шоссе №5, литер'+CHAR(13)+N'A, 2 этаж, к. №323'
select distinct f1 from
(select @t1 as f1 union all select @t2 union all select @t3) a


2 записи выбрал.

То есть, есть какие-то невидимые символы... и что делать? update MyTable SET [Адрес доставки] = REPLACE(@t3,char(13),'') ?
18 авг 14, 14:05    [16456121]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
Durex_
Member

Откуда:
Сообщений: 79
iap
Durex_
iap,
0 записей.
Все символы строк равны между собой.
Но я подумал: а вдруг одна строка длиннее другой?
Сравните DATALENGTH(@t1) и DATALENGTH(@t2)


Сравнивал - одинаковые.
18 авг 14, 14:06    [16456134]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по сравнению строк  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
вопрос вычищения и верификации ваших справочников - это ваша задача.
хотите делайте replace, хотите выгружайте построчно в эталонную таблицу с констрейтом на уникальность, хотите правьте в текстовом виде , а потом заливайте в таблицу
18 авг 14, 14:07    [16456141]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить