类似于 SQL 服务器中具有逗号分隔值的运算符

Like Operator with comma-separated values in SQL Server

比如这是我的原创table

SELECT id, testName FROM tblTest1

每当我的逗号分隔值使用正确的方式时,我就会根据原来的 table.

得到结果

见下图:

DECLARE @Test VARCHAR(100)
SET @Test='General, Narcotic'

SELECT id, testName 
FROM tblTest1 a 
WHERE ISNULL(a.testName, '') LIKE (CASE WHEN isnull(@Test,'') = '' THEN isnull(a.testName,'') 
                                        ELSE '%'+@Test+'%' END)               

但是当我改变逗号分隔值的原始位置时,我没有得到任何输出。

见下图:

DECLARE @Test VARCHAR(100)
SET @Test='Narcotic,General'


SELECT id, testName FROM tblTest1 a 
WHERE isnull(a.testName,'') Like (CASE WHEN isnull(@Test,'') = '' THEN isnull(a.testName,'') 
ELSE '%'+@Test+'%' END)

所以,我想要查询,只要我的逗号分隔字符串在该行中选择所有行(包括不基于原始 table 和 @paramer 的更改逗号分隔值)为空则选择所有行)

你可以用这个。

由于您使用的是 SQL 2005,因此您首先需要创建一个函数来将您的逗号分隔值拆分为行,例如:

CREATE FUNCTION [dbo].[Split]
(@String nvarchar(max), @Delimiter char(1))
RETURNS @Results TABLE (Items varchar(200))
AS
BEGIN
DECLARE @INDEX INT
DECLARE @SLICE nvarchar(max)
-- HAVE TO SET TO 1 SO IT DOESNT EQUAL Z
--     ERO FIRST TIME IN LOOP
SELECT @INDEX = 1
WHILE @INDEX !=0
BEGIN
-- GET THE INDEX OF THE FIRST OCCURENCE OF THE SPLIT CHARACTER
SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
-- NOW PUSH EVERYTHING TO THE LEFT OF IT INTO THE SLICE VARIABLE
IF @INDEX !=0
SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
ELSE
SELECT @SLICE = @STRING
-- PUT THE ITEM INTO THE RESULTS SET
INSERT INTO @Results(Items) VALUES(@SLICE)
-- CHOP THE ITEM REMOVED OFF THE MAIN STRING
SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
-- BREAK OUT IF WE ARE DONE
IF LEN(@STRING) = 0 BREAK
END
RETURN
END
GO

之后您可以使用此功能来获得您想要的结果

DECLARE @Test VARCHAR(100)
SET @Test='Narcotic,General'

select * from (
select items from Split(@test, ',')) as d where d.value like 'na%'

@test 是您的 table 值,使用 Split 函数您正在测试匹配表达式。

我并不是说这是您最终的一站式解决方案,但这只是为您的进一步流程提供思路。

你可以试试IS NULLOR条件

SELECT id, testName
FROM tblTest1 a
WHERE (@test IS NULL OR a.testName LIKE '%'+@test+'%')
CREATE TABLE #temp
(
 varData VARCHAR(50)
 )

 INSERT INTO #temp
 (
     varData
 )
 VALUES
 ('General,Narcotic'),
 ( 'General,ABC')

 DECLARE @Data VARCHAR(50) ='Narcotic,General'
 DECLARE @Query VARCHAR(MAX)=''

 SELECT @Query+='varData LIKE ''%''+'''+value+'''+''%'' AND ' 
 FROM STRING_SPLIT(@Data,',')

 SET @Query='SELECT * FROM #temp WHERE '+ SUBSTRING(@Query,1,LEN(@Query)-4)
 EXEC(@Query)

 DROP TABLE #temp