Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
29 / 29 / 8
Регистрация: 28.01.2013
Сообщений: 211
1

Приблизительное значение SELECT

15.11.2013, 14:10. Показов 957. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброе время суток, подскажите пожалуйста решение проблемы:

Есть таблица в БД имеющая вид:
Например такая запись:
Улица | Дом | Участок.
улица Лесная | 26 | 13

На входе у меня такая строка например: "г.Петрозаводск, ул.Лесная, д.26, кв.17, 185000".
Нужно каким то образом по этой строке сделать SELECT столбца "Участок", т.е чтобы я получил результат = 13.

Пробовал через LIKE и т.д но нужно все равно указывать слишком близкое к правильному значение.

P.S. Заранее всем спасибо. Очень нужно решить данную проблему.
Может есть какой-то алгоритм, чтобы строку разбить на состовляющие: улица, дом и тд.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.11.2013, 14:10
Ответы с готовыми решениями:

Приблизительное значение SELECT
Доброе время суток, подскажите пожалуйста решение проблемы: Есть таблица в БД имеющая вид: ...

Приблизительное значение
Найти приблизительное значение, заменяя прирост функции диференциалом корень квадратный с...

приблизительное значение cos(x)
нужно получить значение cos , и что бы оно совпало с табличным значением , не могу найти ошибку ...

Приблизительное значение числа
Я знаю что в шарпе есть возможность запрашивать не точное значение числа , а то в каком диапазоне...

12
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
15.11.2013, 15:44 2
используйте регулярные выражения для извлечения отдельных данных из строки.
надеюсь, что у вас нет записей типа "улица Лесная" "ул Лесная" "ул. Лесная" "ул.Лесная" потому что тогда оочень сложно найти необходимые данные.

у меня была похожая задача вот кусок кода:
C#
1
2
3
4
 string regs1 = @"(?<city>(?<ct>с-ще|с\.|смт|м\.|с\s|м\s)(?<cn>(\s|\w|\.|’|'|""|-)*)),*\s*(?<street>(?<st>провулок|вул\.*\s*|проспект|бульвар|ж/м|узвіз|пров\.|тупик|пр-т|бульв\.|пр\.|тупик|проїзд|станція|мкр(\.|\s)*|мікрорайон\.*|платф|ст\.|пр\s*-\s*т|квартал|площа|майдан)\s*(?<sn>(\s|\w|\.|’|'|""|-)*)),?\sб\.\s?(?<h>\d+)(-\d+)?(/(?<sub>\d+))?\s?(гурт)?(?<l>\w)?(,?\sкор\.(?<k>\d)?)?(,?\sкв\.(?<f>\d+)?)?";
m = Regex.Match(str, regs1);//входная строка
string cn = m.Groups["cn"].Value.TrimStart().TrimEnd(); //получаем имя города
//аналогично получаем тип города, тип улицы, имя улицы и т.д.
Добавлено через 5 минут
city - полное название города
ct - тип города
cn - имя города
street - полное название улицы
st - тип улицы
sn - имя улицы
h - номер дома
sub - дробь дома
l - буква дома
k - корпус
f - квартира

Добавлено через 1 минуту
в результате где-то одна сотая процента не вылавливается из списка из-за нетривиальных названий или грубых ошибок набора
1
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
15.11.2013, 16:16 3
Цитата Сообщение от Eclipze Посмотреть сообщение
Нужно каким то образом по этой строке сделать SELECT столбца "Участок", т.е чтобы я получил результат = 13
Суда по тому, как вы написали вопрос. у вас строка всегда одна, и результат по этой строке должен получиться тоже один. Таким образом у меня есть 2 варианта:
1. Вычленить номер дома, поделить на 2 и, вуаля, мы получили 13;
2. Проигнорировать обозначению строку, а сделать просто SELECT 13.

А если серьезно, то далеко не все участники форума знают административное устройство города Петрозаводска. Поэтому, для ясности. вам нужно пояснить, каким образом можно понять, что адрес "г.Петрозаводск, ул.Лесная, д.26, кв.17, 185000" относится к 13-му участку.
0
29 / 29 / 8
Регистрация: 28.01.2013
Сообщений: 211
15.11.2013, 16:23  [ТС] 4
Цитата Сообщение от kodv Посмотреть сообщение
каким образом можно понять, что адрес "г.Петрозаводск, ул.Лесная, д.26, кв.17, 185000" относится к 13-му участку.
в этом-то и вся проблема...
Просто есть база с этими участками, а от заказчика приходит список адресов, который нужно запихнуть в базу и присвоить каждому свой участок, сравнив адрес с тем что в базе...
0
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
15.11.2013, 18:00 5
Цитата Сообщение от Eclipze Посмотреть сообщение
Просто есть база с этими участками
То есть, есть таблица, где каждому адресу сопоставлен какой то участок. Это уже хорошо.
Цитата Сообщение от Eclipze Посмотреть сообщение
в этом-то и вся проблема...
Так в чем проблема то заключается? Вы не можете распарсить строку с адресом? Выше есть вариант решения этой проблемы. Вы не можете написать запрос к таблице? Ну так вы до сих пор не показали, какова структура этой таблицы ...
0
29 / 29 / 8
Регистрация: 28.01.2013
Сообщений: 211
16.11.2013, 20:08  [ТС] 6
Цитата Сообщение от kodv Посмотреть сообщение
Ну так вы до сих пор не показали, какова структура этой таблицы ...
Я показал структуру таблицы. Таблица содержит 3 столбца: Улица, Дом, Участок.
Цитата Сообщение от kodv Посмотреть сообщение
Вы не можете распарсить строку с адресом?
Да, мне нужно распарсить строку на отдельные части: Название улицы и дом отдельно. Чтобы сделать обычный SELECT к базе и выдернуть участок. Буду пробовать с регуляркой которую предоставил Learx.

Добавлено через 7 часов 31 минуту
Цитата Сообщение от Learx Посмотреть сообщение
у меня была похожая задача вот кусок кода:
А не могли бы вы написать какую-то строку для примера работы вашей регулярки, а то у меня чет не работает, пробовал всяко записывать, но результата нет.
0
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
16.11.2013, 21:43 7
Если строчки вводятся руками, то есть ненулевая вероятность, что на каких-то записях регулярка сломается.

Правильным было бы сделать БД хотя бы чуть более реляционной - таблица для улиц, таблица для домов, ссылающаяся на таблицу улиц, таблица для корпусов, таблица для адресов, состоящая не из строчек а из полей, ссылающихся на поля других таблиц, таблица участков, ссылающаяся на таблицу домов.

Иначе вы потонете в этих данных.
1
29 / 29 / 8
Регистрация: 28.01.2013
Сообщений: 211
18.11.2013, 10:01  [ТС] 8
Вообщем есть небольшое решение проблемы, провел небольшой анализ и выяснил, что все записи имеют вид строки:

Наименование, Улица, Дом, Корпус, Квартира.

Написал уже небольшую функцию, которая разбивает эту строку на все эти отдельные элементы. Теперь осталось каждый элемент очистить от лишнего треша (запятых, точек, пробелов) и думаю все будет в 95-98% работать, а остальное можно будет руками подправить.
0
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
18.11.2013, 11:14 9
Нормальный подход.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
18.11.2013, 11:19 10
Eclipze, используйте мое регулярное выражение. насколько я помню там аналогичное построение адреса.
только названия на украинском(гурт = общ, б(ьудинок)=дом)
0
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
18.11.2013, 11:24 11
Только если данных много, то применение функции в селекте тормозить будет. В перспективе всё же имеет смысл подумать об оптимизации структуры БД.
0
29 / 29 / 8
Регистрация: 28.01.2013
Сообщений: 211
18.11.2013, 15:43  [ТС] 12
Цитата Сообщение от Learx Посмотреть сообщение
используйте мое регулярное выражение. насколько я помню там аналогичное построение адреса.
только названия на украинском(гурт = общ, б(ьудинок)=дом)
Я пробовал, но чет не работает регулярка у меня. Напишите пожалуйста пример адреса для этой регулярки, попробую разобраться...
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
18.11.2013, 19:06 13
я лучше расспишу что делает моя регулярка а вы уже переделаете под свои нужды.
конструкция ?<name> задает имя группы в выражении
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@"?<city>
//тип города
(?<ct>с-ще|с\.|смт|м\.|с\s|м\s)
//имя города. включаем пробелы, точки, кавычки, апострофы, дефисы в название
(?<cn>(\s|\w|\.|’|'|""|-)*))
//разделитель запятая и пробел (ни одного или несколько)
,*\s*
(?<street>
//тип улицы. 
(?<st>провулок|вул\.*\s*|проспект|бульвар|ж/м|узвіз|пров\.|тупик|пр-т|бульв\.|пр\.|тупик|проїзд|станція|мкр(\.|\s)*|мікрорайон\.*|платф|ст\.|пр\s*-\s*т|квартал|площа|майдан)
//разделитель пробел или без него
\s*
//имя улицы
(?<sn>(\s|\w|\.|’|'|""|-)*))
//разделитель запятая(1 или 0) и обязательно пробел
,?\s
//б(укр-будинок) + точка и пробел(0 или 1)
б\.\s?
//номер дома
(?<h>\d+)
//может быть номер дома через черточку типа 11-1
(-\d+)?
//дробь дома(0 или 1)
(/(?<sub>\d+))?
//пробел (0 или 1)
\s?
//гурт(гуртожиток)=общежитие(0 или 1)
(гурт)?
//буква дома(0 или 1)
(?<l>\w)?
//запятая(0 или 1) +ПРОБЕЛ+кор.
(,?\sкор\.
//номер корпуса
(?<k>\d)?
)? //закрываем корпус(0 или 1)
//запятая(0 или 1)+ПРОБЕЛ+кв.
(,?\sкв\.
(?<f>\d+)? //номер квартиры
)? //без квартиры";
0
18.11.2013, 19:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2013, 19:06
Помогаю со студенческими работами здесь

Вычислить приблизительное значение функции
Дано действительное число x и натуральное число k (0k 10). вычислить при- приблизительно...

Вычислить приблизительное значение бесконечной суммы
Помогите решить задачу! Это очень срочно! Составить программу нахождения суммы бесконечного ряда....

Посчитать приблизительное значение функции sin по заданной формуле
Дальше решаю задачник Абрамяна через c++ Пришел на 23. Вот мое решение: #include &lt;iostream&gt;...

Как изменить значение одного select-а при изменении другого select-а?
Добрый день! Подскажите как изменить значение select при изменении другого select. первый:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru