Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2013.11.03;
Скачать: [xml.tar.bz2];

Вниз

Сравнение таблиц по срок.полям (лишние внутренние пробелы)   Найти похожие ветки 

 
Андрей Пл   (2010-12-22 11:04) [0]

Мне нужно сравнить две таблицы по двум полям и выявить где значения у них не совпадают. И в первой и во второй таблице поле строковое, проблема в том что значения в одной из таблиц могут иметь внутренние лишние пробелы (т.е слова могут разделяться не одним а двумя, тремя.... пробелами). Так вот значения в таблицах считать совпадающими если они полностью идентичны за исключением пробелов:
"aaa bbb"  считать одинаковыми "aaa    bbb"

как мне в скюэль запросе удалить лишние внутренние пробелы (заранее не известно сколько)  или может есть другой способ сравнить...?
заранее спасибо.


 
Ega23 ©   (2010-12-22 11:15) [1]

REPLACE + F1


 
Jeer ©   (2010-12-22 11:18) [2]

REPLACE ?


 
Вариант   (2010-12-22 14:09) [3]


> Jeer ©   (22.12.10 11:18) [2]

Вариант первый короткий - REPLACE-ом удалить вообще все пробелы, коль они не нужны для сравнения типа SELECT REPLACE(строка, " ","")
Вариант второй - удалить до одного пробела WHILE + REPLACE, где маской поиска задать два пробела, а заменой дать один пробел - но это не нужно по заданному вопросу, раз можно вариантом 1(разве что для приведения  уже имеющихся записей таблицы к "красивому виду")


 
Jeer ©   (2010-12-22 14:41) [4]


> Вариант   (22.12.10 14:09) [3]
> > Jeer ©   (22.12.10 11:18) [2]


Это не ко мне :)


 
Вариант   (2010-12-22 14:58) [5]


> Jeer ©   (22.12.10 14:41) [4]

Точно, это автору вопроса:-)


 
ANB   (2010-12-27 18:02) [6]


> Вариант второй - удалить до одного пробела WHILE + REPLACE

while - не даст все сделать в одном запросе - придется писать функцию.

В оракле помог бы RegExp_Replace, но вроде как ms sql тоже научился работать с регулярными выражениями.


 
Вариант   (2010-12-28 14:29) [7]

A
> NB   (27.12.10 18:02) [6]


> while - не даст все сделать в одном запросе - придется писать
> функцию.

Точно, небольшую функцию

> но вроде как ms sql тоже научился работать с регулярными
> выражениями.

Интересно, не слышал. Поискал для 2005 - там это возможно на уровне подключения сборок .NET или использования COM объектов.


 
Ega23 ©   (2010-12-28 17:54) [8]

Зачем функция-то?????
что-то типа

WHERE REPLACE(T1.Field, " ", "") = REPLACE(T2.Field, " ", "")
Сам запрос щас в голову уже не лезет, может из дома напишу.


 
Вариант   (2010-12-29 06:16) [9]


> Ega23 ©   (28.12.10 17:54) [8]

Для первого варианта не нужна.

> Вариант   (22.12.10 14:09) [3]
>
> Вариант первый короткий - REPLACE-ом удалить вообще все
> пробелы, коль они не нужны для сравнения типа SELECT REPLACE(строка,
>  " ","")


А вот второй, где надо оставить один пробел из неизвестного числа пробелов - мне пришло только с WHILE+REPLACE в голову - скрипт получается несложный, но как его оформить одним запросом?


 
Ega23 ©   (2010-12-29 08:01) [10]

Нафига вообще второй вариант? Зачем усложнять-то, если автор чётко напейсал:

> проблема в том что значения в одной из таблиц могут иметь
> внутренние лишние пробелы

Убираем ВСЕ пробелы и сравниваем.


 
Вариант   (2010-12-29 11:12) [11]


> Ega23 ©   (29.12.10 08:01) [10]

Для решения заданного автором вопроса в лоб второй вариант не нужен.
Но мне кажется, что наличие фраз в поле содержащие незначимые пробелы нехорошая практика, если тому конечно нет веских оснований. Правильней на мой взгляд сделать "чистку" таблиц(ы) и создать "правило", запрещающее вносить подобные записи В этом случае и сравнения будут быстрее и не будет "мусора" перед глазами пользователя.


 
Вариант   (2010-12-29 11:16) [12]

И дополнение к

> Вариант   (29.12.10 11:12) [11]


В этом случае для чистки таблицы и возможен вариант два. Хотя если это выполнить однократно, то можно просто на уровне скрипта реализовать, выполняемого их студии. И тогда функция не нужна. А вот если включить как правилом для подчистки при вводе строк на уровне базы, то можно и оформить функцией.


 
Ega23 ©   (2010-12-29 11:17) [13]


> Правильней на мой взгляд сделать "чистку" таблиц(ы) и создать
> "правило", запрещающее вносить подобные записи


http://delphimaster.net/view/15-1293519707/
Буквально вчера писал:

Ega23 ©   (28.12.10 18:27) [53]

> А какой смысл решать техническими средствами организационные
> вопросы?

А это есть частое заблуждение, которым многие (да и я сам, чё скрывать-то) грешат. Всегда хочется, хотя бы ради искусства, чтобы "программа приняла вид лома с кучей настраиваемых шарниров". А лучше фреймворк написать.
А заказчику не нужна "автоматическая обрывалка ушей оператору", ему проще человека специального нанять. Или лучше оператора штрафовать за косяк.

И потом начинаются изгаления по распознаванию введённого текста.
Как сделать, чтобы программа поняла, что "Рога и Копыта Российской Федерации", "Рога и Копыта РФ" и "Poгa и Koпытa PФ" - одна и та же организация с одним ID.
А не надо делать, надо оператора покарать за такой ввод.


 
Вариант   (2010-12-29 11:28) [14]


> Ega23 ©   (29.12.10 11:17) [13]

Насчет оператора -согласен, покарать. Но где можно - надо помочь.
Есть просто информационные поля, типа памятки, мемо -их нафиг и не нужно проверять, они не поисковые. И есть "важные" поля, поля в справочниках, где разарабатывается шаблон ввода, как например для ввода сотовых телефонов или еще какие другие. И если есть возможность задать этот шаблон, то почему бы и нет?  Если к вам со стороны пришел такой справочник и вы будете информацию из него добавлять в свой, то почему бы его не привести в порядок там, где это возможно? Хотя думаю это тема уже скорее в "потрепаться".


 
Ega23 ©   (2010-12-29 11:35) [15]

Практика показывает, что полной защиты от дурака - нет. Всё равно лазейку найдут.
Отсюда следует, что разрабатывать офигенно-навороченную защиту от дурака можно, если это по ТЗ требуется. В остальных случаях проще ограничиться чем-то совсем ненапряжным.


 
Вариант   (2010-12-29 11:45) [16]


> Ega23 ©   (29.12.10 11:35) [15]


> Практика показывает, что полной защиты от дурака - нет.
> Всё равно лазейку найдут.

Согласен.

> Отсюда следует, что разрабатывать офигенно-навороченную
> защиту от дурака можно, если это по ТЗ требуется. В остальных
> случаях проще ограничиться чем-то совсем ненапряжным


Я и не предлагал напряженного варианта. Кстати кроме ТЗ стимулом к действию еще может быть собственная эксплуатация своего же продукта, особенно в экстримальных условиях, при  нехватке времени ... очень может простимулировать. Или опять таки каждодневная рутина, которую опять таки надо делать самому и в какой-то момент понимаешь, что можно сократить время работы, количество действий ну и т.д.
Впрочем, не нравится тебе вариант два - не делай, я же не против:-). Не нужен он автору вопроса, то же его усмотрение...


 
evvcom ©   (2010-12-31 13:41) [17]

Извините, но я понимаю "лишние пробелы" - это когда вместо одного их 2 и более (в том числе и символы табуляции), но удалятьсовершенновсепробелывофразеэтонеправильно! Это аналогично удалению 0 в числах. Если 0 лидирующий, то его можно безболезненно удалить, если уже где-то после первой значимой цифры, то и сам он становится значимым.


 
Вариант   (2010-12-31 18:30) [18]


> evvcom ©   (31.12.10 13:41) [17]

н
> о удалятьсовершенновсепробелывофразеэтонеправильно!

А удалять все в самом поле никто не предлагает.


 
sniknik ©   (2011-01-02 00:07) [19]

> А удалять все в самом поле никто не предлагает.
а не про удаление в поле речь... а о значимости "пустых" символов при сравнении, в зависимости от того где они.
т.е. варианты с  "мама", "ма ма" и " мама" в одном случае не равнозначны, в другом равны.


 
Вариант   (2011-01-05 07:23) [20]


> sniknik ©   (02.01.11 00:07) [19]

Согласен, если вопрос стоит именно так. Но в
> Андрей Пл   (22.12.10 11:04)
об этом сказано явно -

> значения в таблицах считать совпадающими если они полностью
> идентичны за исключением пробелов
>


 
Вариант   (2011-01-05 07:31) [21]


> sniknik ©   (02.01.11 00:07) [19]


Хотя возможна ситуация ложного сравнения, согласен (мне и кажется такая вероятность мала, но тем не менее зачем иметь проблемы, если их можно избежать). Например "12" и "1   2"  будут равнозначны. Тогда вариант №2

> Вариант   (22.12.10 14:09) [3]
- удалить лишние пробелы до одного.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2013.11.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.003 c
15-1368909003
Юрий
2013-05-19 00:30
2013.11.03
С днем рождения ! 19 мая 2013 воскресенье


1-1316688285
denkop
2011-09-22 14:44
2013.11.03
TImage над TStringGrid


15-1369142209
p
2013-05-21 17:16
2013.11.03
Помогите перевести


8-1233235167
iworm
2009-01-29 16:19
2013.11.03
Line in


15-1368891373
Разведка
2013-05-18 19:36
2013.11.03
Помогите устроится программистом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский