SQL Server查询过滤包含值的列

时间:2016-12-15 10:22:08

标签: sql sql-server tsql

我有一个SQL Server表,其中包含一个包含多个电子邮件的列,例如Emails的值由逗号分隔,如:

email1@email1.com,email2@email2.com,email3@email3.com

从另一个包含EmailAddress列的表中,我需要过滤包含Emails的记录,例如

select EmailAddress 
from [dbo].[SomeTable1] 
where EmailAddress contains (select Emails from [dbo].[SomeTable2])

4 个答案:

答案 0 :(得分:1)

试试这个:

 SELECT DISTINCT EmailAddress 
 FROM [dbo].[SomeTable1] A
 INNER JOIN [dbo].[SomeTable2] B ON CHARINDEX(',' + Emails, + ',',',' + EmailAddress + ',')>0

使用CHARINDEX检查Emails中是否存在EmailAddress,是否仅存在JOIN表。

答案 1 :(得分:0)

Select *
 From  [dbo].[SomeTable1] A
 Join  [dbo].[SomeTable2] B
  on   charindex(','+EmailAddress ,','+Emails )>0

答案 2 :(得分:0)

select EmailAddress 
from [dbo].[SomeTable1] tab1 
where exists 
    (select 1 
    from [dbo].[SomeTable2] tab2 
    where '%,'+tab1.EmailAddress+',%' LIKE ','+tab2.Emails+',');

答案 3 :(得分:0)

首先创建一个用户定义的函数,如下所示,以分割逗号分隔值

    create FUNCTION [dbo].[Split] (
          @InputString                  VARCHAR(8000),
          @Delimiter                    VARCHAR(50)
    )

    RETURNS @Items TABLE (
          Item                          VARCHAR(8000)
    )

    AS
    BEGIN
          IF @Delimiter = ' '
          BEGIN
                SET @Delimiter = ','
                SET @InputString = REPLACE(@InputString, ' ', @Delimiter)
          END

          IF (@Delimiter IS NULL OR @Delimiter = '')
                SET @Delimiter = ','

          DECLARE @Item           VARCHAR(8000)
          DECLARE @ItemList       VARCHAR(8000)
          DECLARE @DelimIndex     INT

          SET @ItemList = @InputString
          SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
          WHILE (@DelimIndex != 0)
          BEGIN
                SET @Item = SUBSTRING(@ItemList, 0, @DelimIndex)
                INSERT INTO @Items VALUES (@Item)

                -- Set @ItemList = @ItemList minus one less item
                SET @ItemList = SUBSTRING(@ItemList, @DelimIndex+1, LEN(@ItemList)-@DelimIndex)
                SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
          END -- End WHILE

          IF @Item IS NOT NULL -- At least one delimiter was encountered in @InputString
          BEGIN
                SET @Item = @ItemList
                INSERT INTO @Items VALUES (@Item)
          END

          -- No delimiters were encountered in @InputString, so just return @InputString
          ELSE INSERT INTO @Items VALUES (@InputString)

          RETURN

    END -- End Function

最终查询

 select EmailAddress from [dbo].[SomeTable1] where EmailAddress in
    (select item from [dbo].[SomeTable2] cross apply dbo.Split(Emails,','))