2012-04-17 95 views
0

我在SQL Server 2005中有一个数据表,包含西班牙语中的单词。我已将每个单词存储在一行中。 鉴于一个字符数组,我想查找所有包含这些字符的单词,没有按照它们出现的顺序排列。例如,“avi”与“avion”以及“iva”相匹配。可能吗? 感谢您的关注。在Sql Server中以任意顺序查找字符

+1

你想匹配所有字符?应该返回“vi”还是“avxi”? – 2012-04-18 00:36:02

+0

你好: 是的,我想要得到所有包含谓词的单词,不管它们出现的顺序如何。 – Oscar 2012-04-18 07:52:18

+0

这个单词是否必须包含每个字符 ? – 2012-04-19 21:30:05

回答

2

要做的最简单的事情是拆分和透视,然后加入。

所以AVI变成一个字母表三行:

a 
v 
i 

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

使用GROUP BY word

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

在这个例子中,我刚刚拿起并从这里修改了一个cte Split a string into individual characters in Sql Server 2005以避免愚弄一个数字表(但我通常可能会使用数字表来做我的支点)。

http://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) 
+0

你好: 今天晚上我会试试你的解决方案,谢谢你的帮助! – Oscar 2012-04-18 07:53:07

0

为什么不:

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

这会消耗 “了大量” 资源,所以你不应该使用它在> 100万行(取决于您的服务器上)。

+0

评论为downvote? – Philipp 2012-04-18 12:32:40

+1

这个选项有一个非常糟糕的表现... – Oscar 2012-04-19 10:29:01

+0

是的,如果你看了我写的东西......我不知道它的目的是什么,但如果它只是一个选择...... – Philipp 2012-04-19 22:55:26

相关问题