我有一个表格,其中有两列数据类型为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) + '%'
答案 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 + ')'
并且您只需要生成一个查询返回值列表。