【问题标题】:How to check reverse condition with contains in sql server如何使用包含在 sql server 中检查反向条件
【发布时间】:2017-06-05 01:16:18
【问题描述】:

我在我的 select 语句中使用 contains 来过滤表格中的街道地址,如下所示

DECLARE @ADDRESS VARCHAR(100) = '0 RUBIN CT APT C2'

SET @ADDRESS = '"' + @ADDRESS + '*"'

SELECT * FROM tbl_StreetRecords
WHERE ZipCode = '02021'
AND contains(CompleteAddress,@ADDRESS)

在我的数据库中,我有街道地址“RUBIN CT APT”,而不是“0 RUBIN CT APT C2”。我想检索与地址“RUBIN CT APT”匹配的数据。

我不能使用 LIKE 运算符,因为我有 5000 万条记录。

【问题讨论】:

  • 我没听懂,为什么不直接Contains(CompleteAddress, 'RUBIN CT APT')

标签: sql sql-server sql-server-2008 select sql-server-2005


【解决方案1】:
DECLARE @ADDRESS VARCHAR(100) = '0 RUBIN CT APT C2'

 SET @ADDRESS = '"' + @ADDRESS + '*"'

SELECT * FROM tbl_StreetRecords
WHERE ZipCode = '02021'
AND CHARINDEX(AddressLine1, @ADDRESS) > 0

【讨论】:

  • 如果您建议替代解决方案,您应该明确说明并在此处解释为什么需要替代解决方案
【解决方案2】:

您可以将CONTAINSLIKE 子查询一起使用以仅匹配开始:

DECLARE @ADDRESS VARCHAR(100) = 'RUBIN CT APT'

SELECT * 
FROM (
SELECT * FROM tbl_StreetRecords
WHERE ZipCode = '02021'
AND contains(CompleteAddress,@ADDRESS)
) AS S1 
WHERE S1.CompleteAddress LIKE 'RUBIN CT APT%' 

这样,LIKE 运算符查询将针对较小的记录集运行 (Contains 将使用全文索引来获取 Completeaddress 包含 RUBIN CT APT 的所有行,Like 运算符过滤结果以获取 Completeaddress 列以该值开头的行)

【讨论】:

  • 首先检查包含在 SQL Server 中的工作方式。您的查询不会返回任何记录。
  • @Dineshalla 为什么它不会返回?
  • Contains 将使用全文索引来获取 Completeaddress 包含 RUBIN CT APT 的所有行,并且 Like 运算符过滤结果以获取 Completeaddress 列以该值开头的行
  • 从前端我得到地址为“0 RUBIN CT APT C2”而不是“RUBIN CT APT”,在您的查询中更改并验证一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
相关资源
最近更新 更多