2009-10-12 88 views
5

我需要寫下面的僞代碼的一個有效的T-SQL查詢的版本:如何編寫T-SQL查詢來執行「like in」?

select * from newTable where [name] like in (
    select [name] from oldTable 
) 

我不知道如何去這一點。任何幫助(甚至指導我解決一個存在的問題)都會很棒。謝謝!

編輯: 每一些意見,我會澄清這種特殊情況下。這些表是這樣的:

oldTable 
code varchar(10) 
name varchar(500) 

newTable 
code varchar(10) 
name varchar(500) 

在所有的情況下,oldTable.code <> newTable.code,我想看看是否oldTable.name就像newTable.name的名稱之一。基本上,一些新名稱已經在名稱的開頭或末尾添加了限定符。即:「舊名稱」可能在newTable中具有「合格的舊名稱」。再次感謝。

+0

怎麼樣的新老名稱是「喜歡」,有的說是「不喜歡」對方一些例子嗎? – 2009-10-12 19:27:00

+0

你可以提供一些樣本數據;你有幾種解決方案可以工作,但很大程度上取決於數據的存儲方式。 – 2009-10-12 19:51:02

+1

@Aaron Palmer,你需要舉出舊名和新名的實際例子,以及他們是否相互「喜歡」。舊的「bbb」是否匹配新的「xbbb」?舊的「xyz」匹配「abc」嗎?做舊的「abcxyz」匹配「abc」等,如果你不想舉例,給出匹配規則。 – 2009-10-12 21:10:27

回答

1

我想你只需要刪除例如像:

SELECT * FROM newtable的地方[名稱]中(從oldTable選擇名稱)

6

假設兩個表以某種方式有關。

SELECT newTable.* FROM newTABLE JOIN oldTable ON <JOIN CRITERIA> 
WHERE newTable.[Name] LIKE oldTable.name 
+1

沒有使用通配符它將工作相同= – 2009-10-12 19:28:34

+0

在我看來這是唯一的解決方案,你應該使用。 – ChaosPandion 2009-10-12 20:08:03

0

我們自己遇到了同樣的問題。它可能不適合你,但我們想出的解決方案是: SELECT [Fields]
FROM [Table]
WHERE [Field] like 'Condition1'
OR [Field] like 'Condition2'

不是一個很好的解決方案,但它適用於我們。

2

沒有那麼漂亮,但它的工作原理:

SELECT DISTINCT newtable的*
FROM newtable的
JOIN oldTable
ON newtable的 「名稱」 LIKE oldTable.name

5
DECLARE @nt TABLE (NAME VARCHAR(10)) 
DECLARE @ot TABLE (NAME VARCHAR(10)) 

INSERT INTO @nt VALUES('Stuart') 
INSERT INTO @nt VALUES('Ray') 


INSERT INTO @ot VALUES('St%') 
INSERT INTO @ot VALUES('Stu%') 


SELECT * 
FROM @nt n 
WHERE EXISTS (SELECT * 
       FROM @ot o 
       WHERE n.name LIKE o.name) 
+1

+1與聯合答案不同,這將只返回一條記錄,儘管您可以使用聯接並使用不同的選擇,具體取決於哪一個結束表現更好。 – Yishai 2009-10-12 19:36:17

+0

你是否真的認爲OP在oldTable.name中存儲了「%」?就像你的例子 – 2009-10-12 19:38:41

+1

No.我不知道OP如何存儲他的數據,但他要求「任何幫助」。至少我的示例代碼提供了一些示例數據。 :) – 2009-10-12 19:53:04

1

謝謝大家。 。我使用了以下查詢,受到了LukLed的回答和Stuart Ainsworth的評論的啓發。

SELECT DISTINCT old.code, old.name, new.name, new.code 
FROM newTable new 
JOIN oldTable old 
ON new.name LIKE '%' + old.name + '%' 
WHERE new.code <> old.code 
ORDER BY old.name, new.name 

表現不是很好,但它是一次性分析,它完成了工作。

我選擇了這個在「存在」的原因的版本是因爲它給我的新老表兩個結果。

+0

你可能可以擺脫DISTINCT;由於您顯示的是舊欄和新欄,因此它不會爲您購買太多。如果新欄目在舊欄目上有多個匹配項,則有DISTINCT;在這種情況下,如果他們這樣做,你仍然顯示他們:) – 2009-10-12 20:46:44

0

如果您使用很少使用cross apply您可以輕鬆做到這一點。
(從Stuart竊取代碼臨時表的聲明)

2表不需要有作爲Matthews' answer任何關係。

DECLARE @nt TABLE (NAME VARCHAR(10)) 
DECLARE @ot TABLE (NAME VARCHAR(10)) 

INSERT INTO @nt VALUES('Stuart') 
INSERT INTO @nt VALUES('Ray') 


INSERT INTO @ot VALUES('St%') 
INSERT INTO @ot VALUES('Stu%') 

select distinct n.NAME 
from @nt n 
    cross apply @ot o 
where n.NAME like o.name 
+0

爲什麼交叉應用與交叉聯接?交叉連接將在舊版本的SQL Server以及其他RDBMS中可用。但也許我錯過了一個微妙的東西。 – 2009-10-13 02:32:11

0

在黑暗中僅僅刺傷,但這非常令人想起涉及非標量數據的情況。快速例如使用CSV格式(SQL Server 2005和以上):

WITH oldTable ([name]) 
    AS 
    (
     SELECT '003,006,009,012,015' 
     UNION ALL 
     SELECT '005,015' 
    ), 
    newTable ([name]) 
    AS 
    (
     SELECT '007' 
     UNION ALL 
     SELECT '009' 
     UNION ALL 
     SELECT '015' 
    ) 
SELECT N1.[name] 
    FROM newTable AS N1 
WHERE EXISTS (
       SELECT * 
       FROM oldTable AS O1 
       WHERE ',' + O1.[name] + ',' 
         LIKE '%,' + N1.[name] + ',%' 
      );