Sql 是否有一种方法可以同时搜索两个或多个字段?
我正在考虑创造一些能做到这一点的东西:Sql 是否有一种方法可以同时搜索两个或多个字段?,sql,mysql,database,Sql,Mysql,Database,我正在考虑创造一些能做到这一点的东西: SELECT * FROM (`tm_accounts`) WHERE CONCAT(`last_name`, `first_name`) LIKE '%o%' 当然,这是行不通的。我只是想让你看看我试图模仿的背后的想法 last_name和first_name是accounts表中两个独立的字段我建议使用: SELECT * FROM (`tm_accounts`) WHERE last_name LIKE '%o%' or first_n
SELECT *
FROM (`tm_accounts`)
WHERE CONCAT(`last_name`, `first_name`) LIKE '%o%'
当然,这是行不通的。我只是想让你看看我试图模仿的背后的想法
last_name和first_name是accounts表中两个独立的字段我建议使用:
SELECT *
FROM (`tm_accounts`)
WHERE last_name LIKE '%o%'
or first_name LIKE '%o%';
SELECT a.*
FROM TM_ACCOUNTS a
WHERE a.first_name LIKE '%o%'
UNION
SELECT b.*
FROM TM_ACCOUNTS b
WHERE b.last_name LIKE '%o%'
或
因性能差而臭名昭著,并且存在维护风险
请注意,我使用的是UNION
,它将从最终结果集中删除重复项。虽然UNION-ALL
的性能会更好,但它不会删除重复项,因此不适合在这种情况下使用
如果您不知道,将通配符放在LIKE
标准的左侧不会使用索引。因此,如果您对TM\u账户、姓氏
或TM\u账户、姓氏
有索引(如果使用覆盖索引,则两者都有)
这:
…不是一个好习惯-更好的方法是在子选择/内联视图中执行函数。例如:
SELECT x.*
FROM (SELECT t.*,
CONCAT(t.last_name, t.first_name) AS full_name
FROM TM_ACCOUNTS t) x
WHERE x.full_name LIKE '%o%'
令人惊讶的解释。你有我的+1!更好,但还是不好,除非你没有办法。在大多数RDBMS上,函数中的包装列会阻止在如此包装的列上使用任何索引。@Donnie:索引的使用是没有意义的,因为
类似于“%o
。
SELECT x.*
FROM (SELECT t.*,
CONCAT(t.last_name, t.first_name) AS full_name
FROM TM_ACCOUNTS t) x
WHERE x.full_name LIKE '%o%'