SQL选择自:查询

SQL选择自:查询,sql,Sql,我有一个包含多个地址字段的表,例如地址行1、地址行2等 有没有什么方法可以一次跨多个字段使用WHERE子句,而不必使用OR/AND语句 例如: SELECT * FROM FIN_LIVE.CUSTOMER_ADDRESSES WHERE SYS_ADDRESS_1, SYS_ADDRESS_2, SYS_ADDRESS_3 = 'data' 不,您需要使用和/或 SELECT * FROM FIN_LIVE.CUSTOMER_ADDRESSES WHERE SYS_ADDRES

我有一个包含多个地址字段的表,例如地址行1、地址行2等

有没有什么方法可以一次跨多个字段使用WHERE子句,而不必使用OR/AND语句

例如:

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

不,您需要使用和/或

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

很确定你必须使用和/或

然而,这可能是改变数据结构的标志。你是说有3个地址,其中任何一个都可能是主街123号


在这种情况下,您可能需要将地址数据提取到一个单独的表中。

MySQL
中,使用
MyISAM
,您可以创建
全文索引

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)

(适用于所有主要数据库)。

如果要避免多个
语句只输入标准,即
SYS\u ADDRESS\u 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'

我只是在想为什么要排除像
操作符这样基本的东西?我不认为只有我一个人在这件事上

如果要查找任何一列匹配的行,则可以执行类似的操作,但与简单的OR语句相比,这将是非常低效的

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

我将把它作为一个练习留给读者,让他们把它变成AND语句:)

你为什么不想要AND/OR语句?@Tony:我理解不想使用
s-它们可能很昂贵。这是地址的单独一行吗。。也许您希望对地址字段进行压缩,并将其与数据进行比较。您的数据的示例将非常有助于这里的人们为您提供最有用和最准确的建议。我基本上需要在我的表中找到一个给定的地址(如123 Green St.),但123 Green St.可以位于4个单独的地址字段中的1个,每个字段代表一个地址行。有时客户会将他们的姓名或实际街道地址写在第1行,因此没有一致性,我无法控制这一点。这意味着所有三列中都必须有相同的值。取决于数据,但行地址很少重复。是的,但OP在该子句中可能暗示什么?他可能暗示OR条件。例如,如果有人在枫叶路123号,那可能在地址的第1行、第2行或第3行,这取决于他们是如何输入的。啊,没错。所以这就像是一个数据库列“打鼹鼠”的游戏答案被编辑为包含“或”的可能性。无论如何,我们这里有一个XY问题。同意,这听起来像是一种奇怪的情况,如果您愿意的话,可能应该将其视为代码气味或模式气味。@Alison R:一个邮件地址至少有三行地址是很常见的。第一行可以是农村路线(RR),或“照管”(注明为c/o),第二行可以是apt/套房号(如果与街道地址分开)。没有一致的格式-不知道上述任何一项是否适用于加拿大/美国境外。正确。但根据最初的查询,他问这三个字段中是否有任何一个包含“数据”,我的意思是,是否有任何一行包含“123 Main Street”我们内部数据库中的地址有第1行表示Street#,第2行表示您提到的任何内容。但我们没有保留“家庭住址”、“工作住址”和“学校住址”,这正是我想确保这里不会发生的事情。我们为地址提供了4行,格式不一致。有时,客户的第一行是公司名称、分支机构或联系人的姓名,有时是确切的地址。啊,在这种情况下,请忽略我的评论。