如何编写T-SQL查询来执行“喜欢”?

时间:2009-10-12 19:11:40

标签: sql tsql

我需要编写以下伪代码的有效T-SQL查询版本:

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中具有“合格的旧名称”。再次感谢。

9 个答案:

答案 0 :(得分:6)

假设两个表以某种方式相关。

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

答案 1 :(得分: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)

答案 2 :(得分:2)

不太好,但它确实有效:

SELECT DISTINCT newTable。*
来自newTABLE
加入oldTable
ON newTable。“Name”LIKE oldTable.name

答案 3 :(得分:1)

我认为你只需删除类似的内容,例如:

从newTable中选择*,其中[Name] in(从oldTable中选择名称)

答案 4 :(得分: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

性能不是那么好,但它是一次性分析,它可以完成工作。

我选择“EXISTS”版本的原因是因为它给了我新旧表格的结果。

答案 5 :(得分:0)

姓名如何?好吧,你不能同时做一个LIKE和IN。

这看起来像SOUNDEX的好候选人

使用SOUNDEX进行加入。

在此处阅读:http://msdn.microsoft.com/en-us/library/aa259235%28SQL.80%29.aspx

答案 6 :(得分:0)

我们自己遇到了同样的问题。它可能对您不起作用,但我们提出的解决方案是: SELECT [Fields]
FROM [Table]
WHERE [Field] like 'Condition1'
OR [Field] like 'Condition2'

不是一个很好的解决方案,但它适用于我们。

答案 7 :(得分: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

答案 8 :(得分: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] + ',%' 
              );