如何在SQL中使用多个数字的Like条件(不用于字母表)

时间:2016-02-11 23:46:39

标签: sql sql-server sql-server-2012

我有一个表格,其中有两列数据类型为varchar,如下所示。

create table table1
(
    NAME varchar(60),
    SeriesID varchar(160)
)

Insert into table1
values ('A1', '398,412,411'),
       ('A2', '123,516,203') 

我需要根据运行时给出的生成数字来获取行(可以是任意数字)

我的意思是有一个子查询在运行时返回多个数值,如下所示(这只是一个理解该点的例子)。

有没有办法弯曲使用和检查多个值的相似条件?

SELECT NAME, SeriesID
FROM TABLE1
WHERE SeriesID LIKE '%' + (Subquery) + '%'

4 个答案:

答案 0 :(得分:1)

如果你的子查询一次只返回一个值,那么下面的内容可能会有效:

SELECT NAME, SeriesID
FROM TABLE1
WHERE ',' + SeriesID + ',' LIKE '%,' + (Subquery) + '%'

答案 1 :(得分:1)

使用EXISTS&& DISTINCT

DECLARE @table1 TABLE
    (
      NAME VARCHAR(60) ,
      SeriesID VARCHAR(160)
    )

INSERT  INTO @table1
VALUES  ( 'A1', '398,412,411' ),
        ( 'A2', '123,516,203' ),
        ( 'A3', '322,123,324' ) 

DECLARE @table2 TABLE ( ID VARCHAR(50) )

INSERT  INTO @table2
VALUES  ( '398' ) ,
        ( '322' )

SELECT DISTINCT
        *
FROM    @table1
WHERE   EXISTS ( SELECT 1
                 FROM   @table2
                 WHERE  SeriesID LIKE '%' + ID + '%' )

这是使用Eval SQL.NET库的另一种解决方案(允许在T-SQL中使用C#代码),如果你需要通过正则表达式搜索(在你的情况下可能有点过分)

DECLARE @table1 TABLE
    (
      NAME VARCHAR(60) ,
      SeriesID VARCHAR(160)
    )

INSERT  INTO @table1
VALUES  ( 'A1', '398,412,411' ),
        ( 'A2', '123,516,203' ),
        ( 'A3', '322,123,324' ) 

DECLARE @table2 TABLE ( ID VARCHAR(50) )

INSERT  INTO @table2
VALUES  ( '398|322' )

DECLARE @sqlnet SQLNET = SQLNET::New('Regex.IsMatch(input, pattern)')
SELECT DISTINCT
        *
FROM    @table1
WHERE   EXISTS ( SELECT 1
                 FROM   @table2
                 WHERE  @sqlnet.Val('input', SeriesID).Val('pattern', ID).EvalBit() = 1 )

免责声明:我是项目的所有者Eval SQL.NET

答案 2 :(得分:0)

  SELECT * FROM table WHERE field REGEXP '1740|1938|1940';

然后,您可以使用concat ...

构建REGEXP
  (select group_concat(myColumn separator '|') from..)

答案 3 :(得分:0)

如何(使用已经提供的一些信息):

declare @query  nvarchar(max) = 'SELECT NAME,SeriesID FROM TABLE1 WHERE SeriesID in (' + @Subquery + ')'

并且您只需要生成一个查询返回值列表。