我有一个包含11000个关键字的SQL表。
我想要一个可以找到包含certian字母的字段的查询。
因此,如果我包含“a”和“b”,查询将选择字段中包含字母“a”和字母“b”的所有字段。
答案 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 = '<letters>
<letter>a</letter>
<letter>b</letter>
</letters>'
-- 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%'