2014-12-29 72 views
0

我有一個參數(@FULL_NAME)填充未分類的全名,使用逗號作爲每個單詞的分隔符。我想選擇一個包含該參數中所有單詞的所有行。SQL:匹配整個字符串unsorted

下面是一個例子,我要找的人是:

  • 名: 「胡安·馬丁」
  • 姓: 「洛佩茲」

參數@FULL_NAME有淡水河谷:「馬丁,洛佩茲,JUAN」

下面是我用找到該行的代碼:

DECLARE 
    @SQL nvarchar(max), 
    @FULL_NAME nvarchar(max), 
    @AUX nvarchar(max) 

SET @FULL_NAME = 'MARTIN,LOPEZ,JUAN' 
SET @SQL = 'SELECT * FROM PEOPLE WHERE ' 

DECLARE AUX CURSOR FAST_FORWARD FOR (SELECT strval FROM dbo.Split(@FULL_NAME,',')) 
OPEN AUX 

FETCH NEXT FROM AUX INTO @AUX 
SET @SQL = @SQL + ''' '' + First_Name + '' '' + Last_Name + '' '' LIKE ''% ' + @AUX + ' %''' 

FETCH NEXT FROM AUX INTO @AUX 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @SQL = @SQL + ' AND '' '' + First_Name + '' '' + Last_Name + '' '' LIKE ''% ' + @AUX + ' %''' 
    FETCH NEXT FROM AUX INTO @AUX 
END 

CLOSE AUX 
DEALLOCATE AUX 

SELECT @SQL 

有沒有這樣簡單的方法?

謝謝!

回答

0

你可以這樣做。加入People表,其中表值函數dbo.SplitLike條件下。像這樣的東西。

SELECT First_Name 
FROM PEOPLE A 
     JOIN dbo.Split(@FULL_NAME, ',') B 
     ON A.First_Name + ' ' + A.Last_Name LIKE '%' + B.strval + '%' 
GROUP BY first_name 
HAVING Count (*) = (SELECT Count(*) 
        FROM dbo.Split(@FULL_NAME, ',')) 
+0

根據需要將無法工作。使用該代碼,您將獲得包含至少一個參數@FULL_NAME的所有行。我需要得到那些包括所有這些的。 – smopuiM

+0

@smopuiM - 立即更新。 –

+0

謝謝!這段代碼實際上有效。我不知道「有」的情況。現在我想知道應該使用哪個代碼,原始代碼要快一點,但是這個代碼要簡單得多。 – smopuiM

0
SELECT * FROM PEOPLE 
WHERE First_Name + ' ' + Last_Name 
         LIKE '%' + PARSENAME(REPLACE(@FULL_NAME, ',','.') , 1) + '%' 
OR First_Name + ' ' + Last_Name 
         LIKE '%' + PARSENAME(REPLACE(@FULL_NAME, ',','.') , 2) + '%' 
OR First_Name + ' ' + Last_Name 
         LIKE '%' + PARSENAME(REPLACE(@FULL_NAME, ',','.') , 3) + '%' 
+0

參數@FULL_NAME中的字數不固定。 – smopuiM