0

我在 sql server 2005 中有一个包含西班牙语单词的数据表。我已经将每个单词存储在一行中。给定一个 char 数组,我想找到所有包含这些字符的单词,而不是它们出现的顺序。例如,“avi”应该匹配“avion”和“iva”。可能吗?感谢您的关注。

4

3 回答 3

2

最简单的做法是拆分和旋转,然后加入。

所以 avi 在一个字母表中变成了三行:

a
v
i

然后加入单词列表INNER JOIN ON CHARINDEX(letter, word) > 0

利用GROUP BY word

HAVING COUNT(*) = (SELECT COUNT(*) FROM letters)

在这个例子中,我刚刚从这里挑选并修改了一个 cte在 Sql Server 2005 中将一个字符串拆分为单个字符,以避免不得不用数字表来愚弄(但我通常可能会使用数字表来做我的数据透视)。

https://data.stackexchange.com/stackoverflow/query/67103/http-stackoverflow-com-questions-10199927-find-chars-in-any-order-in-sql-server

DECLARE @t AS TABLE (search varchar(100));
INSERT INTO @t VALUES ('avi');

DECLARE @words AS TABLE (word varchar(100));
INSERT INTO @words VALUES ('avion'), ('iva'), ('name');
with cte as
(
  select substring(search, 1, 1) as letter,
         stuff(search, 1, 1, '') as search,
         1 as RowID
  from @t
  union all
  select substring(search, 1, 1) as letter,
         stuff(search, 1, 1, '') as search,
         RowID + 1 as RowID
  from cte
  where len(search) > 0
)
,letters AS (
  SELECT DISTINCT letter FROM cte
)
SELECT words.word
FROM letters
INNER JOIN @words AS words
    ON CHARINDEX(letter, word) > 0
GROUP BY words.word
HAVING COUNT(*) = (SELECT COUNT(*) FROM letters)
于 2012-04-17T23:25:11.750 回答
1

感谢大家的回答。最后,我通过在 Sql Server 中创建一个能够评估正则表达式的程序集来解决这个问题。这是用作基础的文章:http: //www.codeproject.com/Articles/42764/Regular-Expressions-in-MS-SQL-Server-2005-2008

此致。

于 2012-04-19T10:28:38.727 回答
0

为什么不:

SELECT * FROM words WHERE word LIKE '%a%' AND word LIKE '%v%'AND word LIKE '%i%'

这会消耗“大量”资源,因此您不应在 >1M 行上使用它(取决于您的服务器)。

于 2012-04-17T23:39:43.993 回答