2009-10-16 60 views
1

我有一個包含11000個關鍵字的SQL表。SQL需要返回包含指定字母的每個字段的查詢

我想要一個可以找到包含certian字母的字段的查詢。

因此,如果我包含「a」和「b」,查詢將選擇字段中某處包含字母「a」和字母「b」的所有字段。

+0

你只是在尋找小寫還是大寫? – Thorsten 2009-10-16 21:00:02

回答

0
where somefield like '%a%' or somefield like '%b%' 
3
select * 
from table 
where keyword like '%a%' 
and keyword like '%b%' 

PS這將是超級慢。您可能想要調查全文索引解決方案。

+0

全文索引通常無助於搜索短於3-4個字符的單詞。 – 2009-10-16 20:08:03

+0

因爲無論如何這將會很慢,如果不需要區分大寫和小寫,你可以輸入'lower(關鍵字)'。 – Thorsten 2009-10-16 20:59:16

0
select * from your_table where your_field like '%a%b%' 

,並準備等待一段時間...

編輯:請注意,這個模式尋找一個「一」後「B」(可能與其他的「東西」之間) - - 重讀你的問題,這可能不是你想要的東西......

+0

這實際上不會工作,如果該領域的內容是像'bddddatttt' – 2009-10-16 19:07:32

+0

是的 - 我最初錯誤地讀他的問題說:「...然後寫信'B'」而不是「...和字母'b'「 – 2009-10-16 19:14:45

2

試試這個

Select * From Table 
Where field like '%' + ltrValue1 + '%' 
    And field like '%' + ltrValue2 + '%' 
... etc. 

和表掃描準備爲這種功能不能使用任何現有的指數

1

所有使用LIKE給出的答案都是完全有效的,但是所有提到的答案都會很慢。所以如果你有很多的查詢,並且沒有太多的關鍵字列表發生變化,那麼建立一個允許更快速查詢的結構是值得的。

這裏有一些想法:

如果你正在尋找的是AZ的字母,你不關心大/小寫,您可以添加列containsA .. containsZ和預先填入這些列:

UPDATE table 
SET containsA = 'X' 
WHERE UPEPR(your_field) Like '%A%'; 

(對於所有列等等)。

然後索引包含..列和您的查詢將

SELECT 
FROM your_table 
WHERE containsA = 'X' 
AND containsB = 'X' 

這可以在「索引表」進行標準化iTable與列your_table_key,信,指數信柱和您的查詢變得像

SELECT 
FROM your_table 
WHERE <key> in (select a.key 
    From iTable a join iTable b and a.key = b.key 
    Where a.letter = 'a' 
    AND b.letter = 'b'); 

的這些,都需要一些預處理(也許在觸發器左右),但查詢應該是快了很多。

+0

是的,如果這是一個常見的查詢,預填充可能是最好的選擇。初始填充將需要一段時間,但插入和更新之後發生的插入和更新應該相當快速地在正確書寫的觸發器中,因爲通常隻影響非常少量的行。 – HLGEM 2009-10-16 20:03:23

0

您可以使用遊標和臨時表方法,因此您每次都不進行全表掃描。這樣做的做法是用所有關鍵字填充臨時表,然後使用@letters XML中的每個字符串填充臨時表,它會從臨時表中刪除所有記錄。最後,您的臨時表中只有記錄,其中包含所需的所有字符串。

declare @letters xml 

SET @letters = '&lt;letters&gt; 
      &lt;letter&gt;a&lt;/letter&gt; 
      &lt;letter&gt;b&lt;/letter&gt; 
     &lt;/letters&gt;' 

-- SELECTING LETTERS FROM THE XML 
SELECT Letters.l.value('.', 'nvarchar(50)') AS letter 
FROM @letters.nodes('/letters/letter') AS Letters(l) 

-- CREATE A TEMP TABLE WE CAN DELETE FROM IF A RECORD DOESN'T HAVE THE LETTER 
CREATE TABLE #TempResults (keywordID int not null, keyWord nvarchar(50) not null) 
INSERT INTO #TempResults (keywordID, keyWord) 
SELECT employeeID, firstName FROM Employee 

-- CREATE A CURSOR, SO WE CAN LOOP THROUGH OUR LETTERS AND REMOVE KEYWORDS THAT DON'T MATCH 
DECLARE Cursor_Letters CURSOR READ_ONLY 
FOR 
    SELECT Letters.l.value('.', 'nvarchar(50)') AS letter 
    FROM @letters.nodes('/letters/letter') AS Letters(l) 

DECLARE @letter varchar(50) 
OPEN Cursor_Letters 

FETCH NEXT FROM Cursor_Letters INTO @letter 
WHILE (@@fetch_status <> -1) 
BEGIN 
    IF (@@fetch_status <> -2) 
    BEGIN 
     DELETE FROM #TempResults 
     WHERE keywordID NOT IN 
     (SELECT keywordID FROM #TempResults WHERE keyWord LIKE '%' + @letter + '%') 
    END 
    FETCH NEXT FROM Cursor_Letters INTO @letter 
END 

CLOSE Cursor_Letters 
DEALLOCATE Cursor_Letters 

SELECT * FROM #TempResults 

DROP Table #TempResults 
GO 
1

我會使用通配符搜索。

where <field> like '%[ab]%' 

這不是正則表達式,但它做得很好。 你也可以這樣做<field> like 'sim[oa]ns'變種 - 這將匹配西蒙斯和simans ...

Depnding您整理你可能會或可能不會有包括數據的情況下,like '%[aAbB]%'

至於其他地方提到有備無患因爲當你在做的時候索引超出了問題包含搜索。

克里斯

0

我會假設你的意思是或多或少你說什麼,你想找到你的表的關鍵字,「包含字母‘a’和字母‘B’。」這裏的一些解決方案給出了不同問題的答案。

要獲得包含字母「A」和「B」在他們(而不是那些包含要麼號)的關鍵字,您可以在下面的查詢中使用「AB」爲:

select 
    keyword 
from myTable 
where not exists (
    select Nums26.i from Nums26 
    where Nums26.i <= len(<matchsetstring>) -- or your dialect's equivalent for LEN() 
    and keyword not like '%'+substring(<matchsetstring>,Nums26.i,1)+'%' -- adapt SUBSTRING to your dialect 
); 

名爲「Nums26」表應該包含通過包含26(或更多,如果你可以嘗試除字母匹配更多)的每個值1的列「I」(編入索引的效率)。見下文。其他人給出的建議適用於大/小寫。但是,如果您的排序規則區分大小寫,則不能在此處簡單指定'aAbB',因爲這會請求包含四個字符a,a,b和b中的每一個的關鍵字。您可能使用UPPER並匹配'AB',也許。

create table nums26 (
    i int primary key 
); 
insert into nums26 values (1); 
insert into nums26 select 1+i from nums26; 
insert into nums26 select 2+i from nums26; 
insert into nums26 select 4+i from nums26; 
insert into nums26 select 8+i from nums26; 
insert into nums26 select 16+i from nums26; 
相關問題