簡體   English   中英

SQL查詢-多個關鍵字搜索多列

[英]SQL Query - Multiple Keywords searching Multi Columns

我正在尋找一種使用Coldfusion在帶有多個關鍵字的sql表中搜索多個列的方法。 我目前有以下一半有效的代碼。

<cfquery name="rsSearchEmployees" datasource="#request.database#">
SELECT idn, firstname, lastname
FROM Employees 
WHERE (<cfloop list="#arguments.nameSearchString#" delimiters=" " index="word">firstname LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#Trim(word)#%" /> OR </cfloop> (1 <> 1))
OR (<cfloop list="#arguments.nameSearchString#" delimiters=" " index="word">lastname LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#Trim(word)#%" /> OR </cfloop> (1 <> 1))
ORDER BY firstname ASC

它搜索2列,名字和姓氏,並在文本框中輸入關鍵字。 關鍵字使用cfloop標記細分。

該代碼的確會產生結果,但是如果在一個或兩個列中均未找到2個或多個關鍵字,則當前不會刪除結果。

例如,假設我想搜索史蒂夫·史密斯,當我鍵入史蒂夫時,它將顯示史蒂夫的行。 史密斯也是如此。 如果我輸入Steve Smith,它仍顯示正確的行。

當我輸入像史蒂夫·喬布斯這樣的東西時,它將出錯。 鍵入此內容仍會顯示史蒂夫·史密斯(Steve Smith)不該這樣做的時間。 有誰知道如何解決這個問題?

感謝您的任何幫助。 克里斯

克里斯,

我認為問題的核心是您的邏輯當前正在說“向我顯示所有記錄,其中名字或姓氏與搜索字符串中的一個單詞匹配”。 您允許某人搜索“ Matthew Mark Luke John”作為字符串,以使用這些名稱中的任何一個來吸引人們,而不是僅將搜索詞視為一個名稱。

這導致這樣的事實,由於僅對firstName的匹配,記錄'Steve Jobs'出現在search ='Steve Smith'中。 聽起來SQL邏輯太寬泛了。

聽起來好像您希望搜索將字符串視為全名(名字+姓氏),而不是將多個名稱匹配的列表。 但是,如果提供了多個單詞,則您希望快速縮小匹配所有單詞而不是ANY的記錄的范圍。

名字可能很復雜,名字或姓氏是多個單詞。 這帶來了一些小困難。

期望的結果:

  • 搜索“ Allen”-顯示名字為“ Allen”的記錄
  • 搜索“艾倫·史密斯”會彈出與“艾倫”和/或“史密斯”名字和姓氏都匹配的記錄

此查詢將允許搜索字符串中的任何#個單詞,但僅顯示以某種方式匹配每個單詞的記錄(允許以任何順序搜索名稱,例如,“第一倒數”或“倒數第一”)。 這可能就是您想要的。

SELECT idn, firstname, lastname
FROM Employees 
WHERE 1=1
<cfloop list="#arguments.nameSearchString#" delimiters=" " index="word">
    AND ( firstname like <cfqueryparam cfsqltype="cf_sql_varchar" value="#word#%" />
    OR lastname like <cfqueryparam cfsqltype="cf_sql_varchar" value="#word#%" /> )
</cfloop>

您在LIKE子句的兩邊都用百分號包裹起來,這告訴我您確實想要一些模糊的匹配。 我將跳過SQL WHERE語句,而改用全文本解決方案。 選項包括:

  1. 數據庫全文索引:SQL Server,Oracle和MySQL都有解決方案。
  2. 搜索引擎:ColdFusion 9隨附Verity和SOLR

這些選項中的任何一個都將使您的生活變得更加輕松,並避免了需要在SQL WHERE子句中引入的復雜AND / OR LIKE邏輯才能獲得類似的效果。

進行一些假設,例如您將始終輸入“ firstname”和“ lastname”進行查找,並希望對存根進行模糊搜索,例如smith ...返回smith,smithers等。這可能會做到。 如果您確實想匹配鐵匠,鐵匠等,則可以退回前導百分比。

<cfquery name="rsSearchEmployees" datasource="#request.database#">
SELECT idn, firstname, lastname
FROM Employees 
WHERE firstname like <cfqueryparam cfsqltype="cf_sql_varchar" value="#Trim(word)#%" />
AND lastname like <cfqueryparam cfsqltype="cf_sql_varchar" value="#Trim(word)#%" />
</cfquery>

如果僅搜索一個單詞,則可以運行替代的“ OR” SQL

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM