类似于 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 NULL
和OR
条件
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
比如这是我的原创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 NULL
和OR
条件
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