SQL需要一个返回包含指定字母的每个字段的查询

时间:2009-10-16 19:02:58

标签: sql

我有一个包含11000个关键字的SQL表。

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

因此,如果我包含“a”和“b”,查询将选择字段中包含字母“a”和字母“b”的所有字段。

9 个答案:

答案 0 :(得分:5)

select *
from table
where keyword like '%a%'
and keyword like '%b%'

ps这将是超级慢。您可能需要调查全文索引解决方案。

答案 1 :(得分:2)

试试这个

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

并准备进行表扫描,因为此功能无法使用任何现有索引

答案 2 :(得分:2)

我会使用通配符搜索。

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

这不是正则表达式,但它做得很好。 您还可以执行<field> like 'sim[oa]ns'之类的变体 - 它们将匹配simons和simans ......

您可能需要或不必包含案例数据like '%[aAbB]%'

正如其他地方所提到的那样准备等待,因为当你进行包含搜索时索引是不可能的。

克里斯

答案 3 :(得分:1)

使用LIKE给出的所有答案都是完全有效的,但是所有这些答案都会很慢。因此,如果您在关键字列表中有大量查询而且没有太多更改,那么构建一个允许更快查询的结构是值得的。

以下是一些想法:

如果您要查找的是字母a-z并且您不关心大写/小写,则可以添加包含A .. containsZ的列并预填充这些列:

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

(等等所有列。)

然后索引contains ..列,您的查询将是

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

这可以在“索引表”中进行规范化,使用列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');

所有这些都需要一些预处理(可能在触发器中),但查询应该快得多。

答案 4 :(得分:0)

where somefield like '%a%' or somefield like '%b%'

答案 5 :(得分:0)

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

并准备好等一会儿......

编辑:请注意,此模式会查找“a”后跟“b”(可能还有其他“东西”) - 重读您的问题,这可能不是您想要的......

答案 6 :(得分: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

答案 7 :(得分: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”的表应包含一列“i”(效率索引),其中包含值1到26的每个值(如果您尝试匹配多个字母,则可以使用更多值)。见下文。其他人给出的建议适用于大/小写。但是,如果您的排序规则区分大小写,则不能简单地在此处指定“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;

答案 8 :(得分:0)

最有可能是一种更优雅的方式,但这确实会找到每个带有字母的记录(大写或小写):

select * from your_table
where UPPER(your_field) like '%A%'
or UPPER(your_field) like '%B%'
or UPPER(your_field) like '%C%'
or UPPER(your_field) like '%D%'
or UPPER(your_field) like '%E%'
or UPPER(your_field) like '%F%'
or UPPER(your_field) like '%G%'
or UPPER(your_field) like '%H%'
or UPPER(your_field) like '%I%'
or UPPER(your_field) like '%J%'
or UPPER(your_field) like '%K%'
or UPPER(your_field) like '%L%'
or UPPER(your_field) like '%M%'
or UPPER(your_field) like '%N%'
or UPPER(your_field) like '%O%'
or UPPER(your_field) like '%P%'
or UPPER(your_field) like '%Q%'
or UPPER(your_field) like '%R%'
or UPPER(your_field) like '%S%'
or UPPER(your_field) like '%T%'
or UPPER(your_field) like '%U%'
or UPPER(your_field) like '%V%'
or UPPER(your_field) like '%W%'
or UPPER(your_field) like '%X%'
or UPPER(your_field) like '%Y%'
or UPPER(your_field) like '%Z%'