Помогите разобраться в соединении SQL используя PATINDEX или CHARINDEX - PullRequest
4 голосов
/ 26 августа 2009

Работаю над объединением двух устаревших систем БД в новую базу данных, где я могу избежать глупых проблем, подобных тому, что вы видите ниже. Я пытаюсь выполнить объединение двух таблиц, в которых текстовые данные отличаются и обычно это работает, за исключением случаев, когда фактическая полная фамилия не использовалась в другой таблице. Есть другие столбцы, которые являются частью объединения, но мне все еще нужно выполнить объединение для этих двух столбцов, чтобы получить правильные результаты.

Table1.Column       Table2.Column
Miller            01 Miller
Grant             1-3 Grant
Rice/Bennet       2A Rice

Таким образом (CHARINDEX (table1.column, Table2.Column)> 0) работает исключая ситуации, когда фамилия немного отличается, как рис / Беннет <> 02 Рис.

Как лучше всего справиться с этим? Вообще говоря, этот тип сенарио - единственная задержка.

ОБНОВЛЕНИЕ: я подумал, что, возможно, более простым способом было бы заменить любые цифры и символы до первого пробела в table2.column и использовать его против table1.column ?? В предыдущие годы я обнаружил, что первая пара символов может быть цифрами или буквами, но до начала фамилии есть пробел

Ответы [ 3 ]

2 голосов
/ 26 августа 2009

На основании обновления вашего вопроса, если вы хотите обрезать первые несколько символов, включая пробел во 2-м столбце, и сравнить его с 1-м столбцом, как вы описали, то это то, что вы можете придерживаться в своем предложении WHERE.

(CHARINDEX (ПРАВО (table2.column, len (table2.column) -CHARINDEX ('', table2.column)), table1.column)> 0)

0 голосов
/ 26 августа 2009

Первый параметр CHARINDEX (или PATINDEX) должен быть подстрокой второго параметра. Ни одна из функций не является достаточно умной, чтобы соответствовать определенной части подстроки. «Рис / Беннет» не может быть найден в «Рис 02». Примеры:

CHARINDEX('Miller', '01 Miller') = 4
CHARINDEX('Grant', '03 Grant') = 4
CHARINDEX('Rice/Bennet', '02 Rice') = 0

Чтобы запрос работал, вам нужно создать встроенное представление, в котором вы анализируете значение Table1.Column, чтобы справиться с этими ситуациями. CHARINDEX / PATINDEX сообщает нам, что вы используете SQL Server - если это 2005+, вы можете использовать Common Table Expressions (CTE).

JOIN (SELECT CASE
               WHEN CHARINDEX('/', t.column) > 0 THEN
                 SUBSTRING(t.column, 0, CHARINDEX('/', t.column)-1)
               ELSE
                 t.column
             END AS column
        FROM TABLE1 t) t1 ON CHARINDEX(t1.column, Table2.column) > 0

Имейте в виду, что в этом примере 'Bennet' никогда не будет использоваться для проверки соответствующей записи в таблице 2.

0 голосов
/ 26 августа 2009

Вы ошибаетесь:

select charindex('bcd','abcde')

дает 2

select charindex('abcde','bcd')

дает 0

Rob

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...