2013-07-06 177 views
0

我使用SQL Server 2008的查找列特定單詞

我的表是:

位置

------------------------ 
Id | LocationName 
------------------------ 
    1 | Bodakdev 
    2 | Thaltej Road 
    3 | Andheri East 
    4 | Noida Sector 2 

公司

-------------------------------------------------------------------------- 
    CId | Address           | LocationId 
-------------------------------------------------------------------------- 
    11 | 301, GNFC Infotower, Bodakdev,     | NULL 
    12 | 307/308,Arundeep Complex       | NULL 
    13 | 7 Krishana Dyeing Compund, Nagardas rd., Andheri | NULL 
    14 | B-23 ,Ground Floor,Sector 2      | NULL 
-------------------------------------------------------------------------- 

目前LocationIdCompany表中爲空。如果Address包含任何位置名稱,則更新LocationId

例如,CID的地址 - 11含有Bodakdev然後更新LocationId 1,第二個例子中,CID的地址 - 13包含Andheri字然後更新LocationId 3.

需要的輸出:

CId | Address           | LocationId 
-------------------------------------------------------------------------- 
    11 | 301, GNFC Infotower, Bodakdev,     | 1 
    12 | 307/308,Arundeep Complex       | NULL 
    13 | 7 Krishana Dyeing Compund, Nagardas rd., Andheri | 3 
    14 | B-23 ,Ground Floor,Sector 2      | 4 
-------------------------------------------------------------------------- 

我已嘗試使用以下查詢

SELECT 
    (LEN(Address) - LEN(REPLACE(Address, LocationName, '')))/LEN(LocationName) 

if Address contains Location Name then then it will r eturn出現次數,否則返回0.

但它不會給出正確的輸出。我怎樣才能做到這一點?謝謝。任何建議,將不勝感激。

+0

你想要更新數據庫中的行或產生輸出的查詢是否足夠? – ojblass

+0

@ojblass我想更新數據庫中的行,但首先我試圖獲取位置標識。 – Prashant16

+0

你爲什麼不使用'like'關鍵字? –

回答

4

嘗試以下查詢:

1.STEP1:使一個功能,可以通過任何字符分割刺痛,以表格的形式返回輸出。

CREATE FUNCTION [dbo].[fnSplit](
    @sInputList VARCHAR(8000) -- List of delimited items 
    , @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items 
) RETURNS @List TABLE (item VARCHAR(8000)) 

BEGIN 
DECLARE @sItem VARCHAR(8000) 
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0 
BEGIN 
SELECT 
    @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))), 
    @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList)))) 

IF LEN(@sItem) > 0 
    INSERT INTO @List SELECT @sItem 
END 

IF LEN(@sInputList) > 0 
INSERT INTO @List SELECT @sInputList -- Put the last item in 
RETURN 
END 

2.STEP2:使用以下查詢來獲得您的願望輸出。

DECLARE @LOCATION AS TABLE (ID INT ,NAME VARCHAR(MAX)) 
DECLARE @COMPANY AS TABLE (CID INT , ADDRESS VARCHAR(MAX) , LOCATIONID INT)  

INSERT INTO @LOCATION VALUES(1,'Bodakdev') 
INSERT INTO @LOCATION VALUES(2,'Thaltej Road') 
INSERT INTO @LOCATION VALUES(3,'Andheri East') 
INSERT INTO @LOCATION VALUES(4,'Noida Sector 2') 

INSERT INTO @COMPANY VALUES(11,'301, GNFC Infotower, Bodakdev,' , NULL) 
INSERT INTO @COMPANY VALUES(12,'307/308,Arundeep Complex' , NULL) 
INSERT INTO @COMPANY VALUES(11,'7 Krishana Dyeing Compund, Nagardas rd., Andheri' , NULL) 
INSERT INTO @COMPANY VALUES(11,'B-23 ,Ground Floor,Sector 2' , NULL) 

UPDATE @Company 
SET 
LOCATIONID = B.ID 
FROM @COMPANY AS A , @LOCATION AS B 
WHERE 
1 = CASE WHEN 
      (
       SELECT COUNT(*) 
       FROM FNSPLIT(B.NAME , ' ') 
       WHERE A.ADDRESS LIKE '%' + ITEM + '%' 
      ) > 0 THEN 1 ELSE 0 END 

這是一種方法。我們也可以使用全文搜索來完成。

+0

我已經嘗試使用LIKE,但它不會給我預期的輸出 – Prashant16

+0

但是以什麼特定方式使用'LIKE'?完全像這樣? – stakx

+0

沒有得到你的問題。你能解釋一下嗎? –