我有一个包含多个地址字段的表格,例如address_line_1,address_line_2等。
有没有办法可以一次跨多个字段使用WHERE子句,而不必使用OR / AND语句?
例如:
SELECT *
FROM FIN_LIVE.CUSTOMER_ADDRESSES
WHERE SYS_ADDRESS_1, SYS_ADDRESS_2, SYS_ADDRESS_3 = 'data'
答案 0 :(得分:5)
很确定你必须使用AND / OR
但是,这可能是改变数据结构的标志。你是说有3个地址,其中任何一个都可能是123 Main Street?
在这种情况下,您可能需要将地址数据提取到单独的表中。
答案 1 :(得分:1)
不,你需要使用AND / OR。
SELECT *
FROM FIN_LIVE.CUSTOMER_ADDRESSES
WHERE SYS_ADDRESS_1 = 'data'
AND SYS_ADDRESS_2 = 'data'
AND SYS_ADDRESS_3 = 'data'
答案 2 :(得分:1)
在使用MySQL
的{{1}}中,您可以创建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)
(适用于所有主要数据库)。
答案 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
运算符那样基本的东西?我认为我并不孤单!
答案 4 :(得分:0)
如果你正在寻找任何一个列匹配的行,那么你可以做这样的事情,但与简单的OR语句相比,它的效率非常低。
SELECT
*
FROM
Customer_Addresses
WHERE
'|*|' + sys_address_1 + '|*|' + sys_address_2 + '|*|' + sys_address_3 + '|*|' LIKE '%|*|' + @search_string + '|*|%'
我会把它作为练习留给读者把它变成一个AND语句:)