【问题标题】:Match multiple columns with same value SQL匹配多个具有相同值 SQL 的列
【发布时间】:2013-01-02 02:40:05
【问题描述】:

假设表格有 akey1bkey2ckey3 等列。
有没有办法搜索一个共同的价值

SELECT * FROM table WHERE %key% LIKE 'xyz'

除了使用多个 AND , OR 条件。 解决方案是否针对 DBMS 无关紧要。

【问题讨论】:

标签: sql


【解决方案1】:

缺少动态 sql,您必须拼出每个列名。但是您可以获得一些语法快捷方式,并且只列出一次常量:

SELECT * FROM table WHERE 'xyz' IN (akey1, bkey2, ckey3)

使用动态 sql,您仍然必须发出相同的查询...但您至少可以先使用字符串工具来构建它,如果您想使用通配符匹配,您可以查看 information_schema.columns 视图找到他们。但是,这涉及打开和迭代游标或将列数据返回给客户端,其中任何一个都涉及到更多的工作,而不仅仅是在原始查询中列出列名。希望您在开始向其发出查询之前至少对您的数据库有足够的了解。

【讨论】:

  • 这个查询性能会很低。我建议执行类似“select * from table where akey1 = 'xyz' or bkey2='xyz' or ckey3='xyz';”的查询,其中每列都有索引。
  • 这通常会产生基本相同的执行计划,我怀疑您对索引如何工作的理解存在缺陷。您不能单独索引这些列并期望它有所帮助。通常,该表的给定查询中只能使用表上的一个索引(尽管查询引擎可以将其重写为一堆 UNION,在这种情况下,多个索引可以提供帮助……但这不是规范)。
【解决方案2】:

你也可以试试这个方法

ALTER PROCEDURE USP_GetClinicNameList
	 
	 @SearchStr varchar(50)
AS
BEGIN

SET @SearchStr = RTRIM(@SearchStr) + '%'

SELECT TOP (10)
	*
FROM clinic c
WHERE c.cclinicname LIKE @SearchStr
OR c.caddress1 LIKE @SearchStr
OR c.caddress2 LIKE @SearchStr
OR c.ccity LIKE @SearchStr
OR c.cstate LIKE @SearchStr
OR c.cclinicid LIKE @SearchStr
OR c.czip LIKE @SearchStr
OR c.ccliniccode LIKE @SearchStr
OR c.cphone LIKE @SearchStr
ORDER BY c.cclinicname

END
GO

希望它会更容易理解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    相关资源
    最近更新 更多