SQL 多條件查詢
使用逗號間隔多關鍵字查詢及對多個欄位進行搜查,組合條件為"或"。
※逗號前後不可留空白,否則會查出全部的資料
SQL
- DECLARE @strKeyword VARCHAR(512);
- SET @strKeyword = 'john,howard,lee';
-
- SELECT * FROM v_HRM_Evaluation
- JOIN dbo.FN_SPLIT_TBL(@strKeyword,',') tblB
- ON name + batchnumber + jobtitles +
- CONVERT(varchar(30),joblevel) + workingfunc +
- ogno + ogname + ouno + ouname + ename + status +
- CONVERT(varchar(30),cdt,120) LIKE '%'+tblB.Value+'%'
- WHERE 1=1
FN_SPLIT_TBL
- --註:字串切割,用在單一欄位多條件同時查詢,如:(Select * from Table Where name like '%張%' or name like '%陳%' or name like '%王%')
- --引用範例(一):
- --select tblA.* from t_HRM_Evaluation tblA join dbo.FN_SPLIT_TBL('張,陳,王',',') tblB on tblA.name like '%'+tblB.Value+'%'
- --引用範例(二):
- --SELECT dbo.[FN_SPLIT](Name.Value, 2, '=') as Name,
- --dbo.[FN_SPLIT](Age.Value, 2, '=') as Age,
- --dbo.[FN_SPLIT](Job.Value, 2, '=') as Job,
- --dbo.[FN_SPLIT](Location.Value, 2, '=') as Location,
- --dbo.[FN_SPLIT](Add_Date.Value, 2, '=') as Add_Date
- --FROM HR data
- -- CROSS APPLY FN_SPLIT_TBL(data.Details, '|') Name
- -- CROSS APPLY FN_SPLIT_TBL(data.Details, '|') Age
- -- CROSS APPLY FN_SPLIT_TBL(data.Details, '|') Job
- -- CROSS APPLY FN_SPLIT_TBL(data.Details, '|') Location
- -- CROSS APPLY FN_SPLIT_TBL(data.Details, '|') Add_Date
- --WHERE Name.Pos = 1 AND Age.Pos = 2 AND Job.Pos = 3 AND Location.Pos = 4 AND Add_Date.Pos = 5
-
- CREATE FUNCTION [dbo].[FN_SPLIT_TBL](@InExp varchar(8000), @Sep varchar(10)) --SELECT * FROM DBO.[FN_SPLIT_TBL]('TEST1,TEST2', ',')
- RETURNS @Res TABLE(
- Pos int,
- Value varchar(max))
- AS
- BEGIN
- WITH Pieces(pn, start, stop) AS (
- SELECT 1, 1, CHARINDEX(@Sep, @InExp)
- UNION ALL
- SELECT pn + 1, stop + 1, CHARINDEX(@sep, @InExp, stop + 1)
- FROM Pieces
- WHERE stop > 0
- )
-
- INSERT INTO @Res
- SELECT pn, SUBSTRING(@InExp, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
- FROM Pieces OPTION (MAXRECURSION 0);
-
- RETURN;
- END
FN_SPLIT
- --註:無
- --引用範例(一):
- --SELECT
- --dbo.[FN_SPLIT](data.Name, 2, '=') as Name,
- --dbo.[FN_SPLIT](data.Age, 2, '=') as Age,
- --dbo.[FN_SPLIT](data.Job, 2, '=') as Job,
- --dbo.[FN_SPLIT](data.Location, 2, '=') as Location,
- --dbo.[FN_SPLIT](data.Add_Date, 2, '=') as Add_Date
- --FROM (
- -- SELECT
- -- dbo.[FN_SPLIT](Details, 1, '|') as Name,
- -- dbo.[FN_SPLIT](Details, 2, '|') as Age,
- -- dbo.[FN_SPLIT](Details, 3, '|') as Job,
- -- dbo.[FN_SPLIT](Details, 4, '|') as Location,
- -- dbo.[FN_SPLIT](Details, 5, '|') as Add_Date
- -- FROM HR) data
-
-
-
- CREATE FUNCTION [dbo].[FN_SPLIT] ( --SELECT DBO.FN_SPLIT('TEST1 , TEST2', 2, ',')
- @s varchar(512),
- @i int,
- @sep char(1) = ',')
- RETURNS varchar(512)
- AS
- BEGIN
- DECLARE @Ret VARCHAR(512);
-
- WITH Pieces(pn, start, stop) AS (
- SELECT 1, 1, CHARINDEX(@sep, @s)
- UNION ALL
- SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
- FROM Pieces
- WHERE stop > 0
- )
- SELECT @Ret =
- RTRIM(SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END))
- FROM Pieces
- WHERE pn = @i
-
- RETURN @Ret;
- END