2012-04-17 98 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

相關問題