2010-01-21 2 views
0

У меня есть таблица с несколькими полями для адреса, такие как address_line_1, address_line_2 и т.д.SQL SELECT FROM: Запрос

Есть ли способ, что я могу использовать ИНЕКЕ по нескольким полям сразу, без необходимости использовать инструкцию OR/AND?

Например:

SELECT * 
    FROM FIN_LIVE.CUSTOMER_ADDRESSES 
WHERE SYS_ADDRESS_1, SYS_ADDRESS_2, SYS_ADDRESS_3 = 'data' 
+0

Почему вы не хотите, И/ИЛИ заявление? –

+0

@ Тони: Я понимаю, что я не хочу использовать 'ИЛИ' 'ы, они могут быть дорогими. –

+0

Это отдельные строки адреса? .. возможно, вы хотели бы CONCAT_WS() поля адреса и сравнить их с данными. Примеры того, как выглядят ваши данные, очень помогли бы людям здесь дать вам самые полезные и точные советы. – JAL

ответ

5

Довольно, что вы должны будете использовать AND/OR

ОДНАКО, может быть, это знак того, чтобы изменить структуру данных. Вы говорите, что есть 3 адреса, и любой из них может быть 123 Main Street?

В этом случае, возможно, вам нужно вытащить адресные данные в отдельную таблицу.

+3

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

+0

@Alison R .: Обычно для почтового адреса имеется по крайней мере три адресные строки. Первой строкой может быть Rural Route (RR) или «забота» (отмечена как c/o), вторая может быть apt/suite number, если она отделена от адреса улицы. Не существует согласованного формата - dunno, если какое-либо из вышеизложенного касается вне Канады/США. –

+0

Правильно. Но, основываясь на первоначальном запросе, он спрашивает, содержит ли какое-либо из трех полей «данные», что я имел в виду, какая-либо из строк содержит «123 Main Street». Наши адреса в нашей внутренней БД имеют строку 1 для улицы №, строка 2 за все, что вы упомянули там. Но мы не храним «домашний адрес» «рабочий адрес» и «школьный адрес», поэтому я хотел убедиться, что здесь не происходит. – taylonr

1

Нет, вы должны будете использовать AND/OR.

SELECT * 
FROM FIN_LIVE.CUSTOMER_ADDRESSES 
WHERE SYS_ADDRESS_1 = 'data' 
    AND SYS_ADDRESS_2 = 'data' 
    AND SYS_ADDRESS_3 = 'data' 
+1

Это означало бы, что одно и то же значение должно присутствовать во всех трех столбцах. Зависит от данных, но адреса линий редко дублируются. –

+0

это будет работать, только если у вас странный адрес. – gingerbreadboy

+0

Да, но что еще может означать OP с этим предложением? –

1

В MySQL с MyISAM, вы можете создать FULLTEXT индекс

CREATE FULLTEXT INDEX fx_customeraddresses_123 ON FIN_LIVE.CUSTOMER_ADDRESSES (SYS_ADDRESS_1, SYS_ADDRESS_2, SYS_ADDRESS_3) 

и выдает этот запрос:

SELECT * 
FROM FIN_LIVE.CUSTOMER_ADDRESSES 
WHERE MATCH(SYS_ADDRESS_1, SYS_ADDRESS_2, SYS_ADDRESS_3) AGAINST ('+data') 

, который возвращает все записи со словом data в любом из полей.

Вы даже можете запросить его без индекса:

SELECT * 
FROM FIN_LIVE.CUSTOMER_ADDRESSES 
WHERE MATCH(SYS_ADDRESS_1, SYS_ADDRESS_2, SYS_ADDRESS_3) AGAINST ('+data' IN BOOLEAN MODE) 

, но это будет гораздо медленнее.

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

SELECT * 
FROM FIN_LIVE.CUSTOMER_ADDRESSES 
WHERE 'data' IN (SYS_ADDRESS_1, SYS_ADDRESS_2, SYS_ADDRESS_3) 

(работает во всех основных базах данных).

0

Если вы хотите, чтобы избежать многочисленных AND заявления только ввести критерий, т.е. SYS_ADDRESS_1 = 'data', один раз, вы всегда можете сделать:

SELECT * 
    FROM FIN_LIVE.CUSTOMER_ADDRESSES 
WHERE 
    SYS_ADDRESS_1 = SYS_ADDRESS_2 
    AND SYS_ADDRESS_2 = SYS_ADDRESS_3 
    AND SYS_ADDRESS_3 = 'data' 

Я только размышлял, почему вы хотите, чтобы исключить что-то, как элементарно оператор AND? Я не думаю, что я один в этом!

0

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

SELECT 
    * 
FROM 
    Customer_Addresses 
WHERE 
    '|*|' + sys_address_1 + '|*|' + sys_address_2 + '|*|' + sys_address_3 + '|*|' LIKE '%|*|' + @search_string + '|*|%' 

Я оставлю его в качестве упражнения для читателя, чтобы превратить это в И заявление :)