【问题标题】:How to do a LIKE search with another table's values?如何使用另一个表的值进行 LIKE 搜索?
【发布时间】:2015-09-14 17:27:10
【问题描述】:

我想对两个表进行 LIKE 搜索。一个表有一列搜索词,另一表具有执行 LIKE 搜索的列。以下是表格:

create table #TableA
(
    UserName Varchar(50)
)
create table #TableB
(
    Department Varchar(50),
    Keyword Varchar(50)
)
Insert Into #TableA VALUES('bob_sales') 
Insert Into #TableA VALUES('mary_accounting')
Insert Into #TableA VALUES('sammi_accountant')
Insert Into #TableA VALUES('fred_bestSellerEver123')

Insert Into #TableB VALUES('Accounting', 'accounting') 
Insert Into #TableB VALUES('Accounting', 'accountant')
Insert Into #TableB VALUES('Sales', 'sales')
Insert Into #TableB VALUES('Sales', 'seller')

我想运行一个使用 LIKE %keyword% 的查询并给我:

bob_sales              | Sales
mary_accounting        | Accounting
sammi_accountant       | Accounting
fred_bestSellerEver123 | Sales

【问题讨论】:

  • 是某种数据清理吗?
  • 这是为了能够根据将数据与各个部门相关联的关键字术语对大量数据进行分类

标签: join sql-server-2012


【解决方案1】:

另一种方法,不用join,只是为了好玩:

select department, 
(select top 1 username from #tablea a 
where a.username like '%' + b.keyword + '%') UserName
from #tableb b

【讨论】:

  • 请记住,select 中的子查询可以返回多于 1 行,并且都会失败
  • 现在使用TOP 1 非常棒,您将获得如下行的随机结果:bob_sales _accounting
  • 非常正确,添加了前 1 以解决该问题。很好的建议。
  • 也许,理想情况下我们不会使用“like”来加入生产表。添加带有键的引用表以进行更传统的连接可能还为时不晚。
【解决方案2】:

SqlFiddleDemo

SELECT
   ta.UserName
   ,tb.Department
FROM TableA ta
JOIN TableB tb
  ON  ta.UserName LIKE '%' + tb.[keyword] + '%' 
 /* If needed  add COLLATE Latin1_General_CI_AS */

备注:

如果您的数据可以包含以下内容:sammi_accountant_accounting,则应将 DISTINCT 添加到 SELECT 语句以避免重复。

对于bob_sales_accounting,bob 会出现两次,因为它属于 2 个组。

【讨论】:

  • 好的,哇。我不知道你可以加入吗?我一直认为必须对相同数据的两列进行 JOIN。很酷,谢谢。当我在我的数据库中对 LIKE % % 的所有其他使用都不区分大小写时,为什么这似乎是区分大小写的?可能是因为 TEMP 表?
  • 区分大小写取决于使用的排序规则,您的 tempdb 可以与您使用的数据库不同,您可以添加 COLLATE ... case_insensitve
  • @FujiBob 检查此SELECT name, collation_name FROM sys.databases 并将 tempdb 与您的数据库进行比较。使用不区分大小写且适用于您的语言的 COLLATION
  • @FujiBob 太好了,很高兴我能帮上忙 :)
  • @FujiBob 以防万一你可以添加DISTINCTGROUP BY 如果有sammi_accountant_accounting 记录可以匹配多次
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
相关资源
最近更新 更多