Возврат частичных совпадений адресов и позиции несоответствия с использованием L2S или SQL - PullRequest
1 голос
/ 02 марта 2010

Мне нужно реализовать метод, который берет адрес, разделенный на отдельные части, и возвращает все совпадающие элементы из таблицы адресов. Если совпадений не найдено, я хочу иметь возможность вернуть значение, указывающее, где это не удалось. Каждый входной параметр имеет соответствующее поле в таблице.

Подпись будет выглядеть примерно так:

List<Address> MatchAddress(string zipCode, string streetName, string houseNumber, string houseLetter, string floor, string appartmentNo, out int mismatchPosition)
{
  // return matching addresses
  // if none found, return the position where it stopped matching
  // zipCode is position 0, appartmentNo is position 5
  //
  // an empty param value indicates "don't check"
}

Я знаю, что могу построить метод так, чтобы я начинал со всех параметров, выполнял запрос и затем удалял параметр за параметром (с правой стороны) до тех пор, пока не будет найдено совпадение или не закончатся параметры, но могу ли я построить запрос, который более эффективен, чем этот, то есть минимизировать количество обращений к БД, может быть, даже как один вызов?

1 Ответ

1 голос
/ 12 марта 2010

Я думаю, вы могли бы получить решение в одном запросе, используя операторы case и несколько вложенных запросов, но прежде чем я пойду туда, я не уверен, что следую тому, что вы пытаетесь выполнить. Предположим, что следующий примерный набор данных:

ID   House_Number    Street_Name   Zip_Code
=============================================
1            3012            Elm      10010
2             412            9th      10010
3             412           Main      90210
4             710           Main      60606

Также предположим следующий вызов метода, передавая почтовый индекс, имя и номер дома:

MatchAddress('10010', 'Main', '710')

Что бы вы хотели вернуть в этом случае? Ваша подпись имеет единственную переменную out для позиции несоответствия, но этот пример будет частично соответствовать всем четырем записям, включенным по крайней мере в один элемент. Что бы вы хотели вернуть для записи 1, например, где есть совпадение по почтовому индексу, но не по атрибутам house_number или street_name?

======================================

ОК, видел ваш комментарий. Вот вопрос, который, я думаю, находится на правильном пути для вас. Предложение WHERE - это серия OR, которые возвращают любую запись, которая соответствует хотя бы одному из критериев. Затем оператор case смотрит, где они не равны переданному значению. Очевидно, что наименее конкретное совпадение является субъективным, но вы можете переупорядочить оператор case, чтобы установить желаемые критерии соответствия в нужном вам порядке. Я работал здесь над базой данных MySQL.

SELECT address.*, CASE 
    WHEN zip_code <> '10010' THEN 'No match on Zip'
    WHEN street_name <> 'Elm' THEN 'No match on Street Name'
    WHEN house_number <> '29' THEN 'No match on House Number'
    ELSE 'Match on all elements'
  END AS zip_match
from address
where zip_code = '10010'
OR street_name = 'Elm'
OR house_number = '29'

Я заставил его вернуть некоторые довольно многословные утверждения для ясности здесь, но вы, очевидно, могли бы, чтобы он возвращал числовой код или что-то еще, что имеет смысл для вас. Это также не учитывает такие проблемы, как чувствительность к регистру. Как написано, он также ищет точное совпадение регистра. В зависимости от вашей среды БД или того, как хранятся ваши данные, вам может потребоваться решить эту проблему, если вы этого не хотите.

...