2015年12月9日 星期三

Searching in SQL Multiple Keyword

SQL 多條件查詢

使用逗號間隔多關鍵字查詢及對多個欄位進行搜查,組合條件為"或"。
※逗號前後不可留空白,否則會查出全部的資料



SQL
  1. DECLARE @strKeyword VARCHAR(512);
  2. SET @strKeyword = 'john,howard,lee';
  3.  
  4. SELECT * FROM v_HRM_Evaluation
  5. JOIN dbo.FN_SPLIT_TBL(@strKeyword,',') tblB
  6. ON name + batchnumber + jobtitles +
  7. CONVERT(varchar(30),joblevel) + workingfunc +
  8. ogno + ogname + ouno + ouname + ename + status +
  9. CONVERT(varchar(30),cdt,120) LIKE '%'+tblB.Value+'%'
  10. WHERE 1=1


FN_SPLIT_TBL
  1. --註:字串切割,用在單一欄位多條件同時查詢,如:(Select * from Table Where name like '%張%' or name like '%陳%' or name like '%王%')
  2. --引用範例(一):
  3. --select tblA.* from t_HRM_Evaluation tblA join dbo.FN_SPLIT_TBL('張,陳,王',',') tblB on tblA.name like '%'+tblB.Value+'%'
  4. --引用範例(二):
  5. --SELECT dbo.[FN_SPLIT](Name.Value, 2, '=') as Name,
  6. --dbo.[FN_SPLIT](Age.Value, 2, '=') as Age,
  7. --dbo.[FN_SPLIT](Job.Value, 2, '=') as Job,
  8. --dbo.[FN_SPLIT](Location.Value, 2, '=') as Location,
  9. --dbo.[FN_SPLIT](Add_Date.Value, 2, '=') as Add_Date
  10. --FROM HR data
  11. -- CROSS APPLY FN_SPLIT_TBL(data.Details, '|') Name
  12. -- CROSS APPLY FN_SPLIT_TBL(data.Details, '|') Age
  13. -- CROSS APPLY FN_SPLIT_TBL(data.Details, '|') Job
  14. -- CROSS APPLY FN_SPLIT_TBL(data.Details, '|') Location
  15. -- CROSS APPLY FN_SPLIT_TBL(data.Details, '|') Add_Date
  16. --WHERE Name.Pos = 1 AND Age.Pos = 2 AND Job.Pos = 3 AND Location.Pos = 4 AND Add_Date.Pos = 5
  17.  
  18. CREATE FUNCTION [dbo].[FN_SPLIT_TBL](@InExp varchar(8000), @Sep varchar(10)) --SELECT * FROM DBO.[FN_SPLIT_TBL]('TEST1,TEST2', ',')
  19. RETURNS @Res TABLE(
  20. Pos int,
  21. Value varchar(max))
  22. AS
  23. BEGIN
  24. WITH Pieces(pn, start, stop) AS (
  25. SELECT 1, 1, CHARINDEX(@Sep, @InExp)
  26. UNION ALL
  27. SELECT pn + 1, stop + 1, CHARINDEX(@sep, @InExp, stop + 1)
  28. FROM Pieces
  29. WHERE stop > 0
  30. )
  31.  
  32. INSERT INTO @Res
  33. SELECT pn, SUBSTRING(@InExp, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
  34. FROM Pieces OPTION (MAXRECURSION 0);
  35.  
  36. RETURN;
  37. END


FN_SPLIT
  1. --註:無
  2. --引用範例(一):
  3. --SELECT
  4. --dbo.[FN_SPLIT](data.Name, 2, '=') as Name,
  5. --dbo.[FN_SPLIT](data.Age, 2, '=') as Age,
  6. --dbo.[FN_SPLIT](data.Job, 2, '=') as Job,
  7. --dbo.[FN_SPLIT](data.Location, 2, '=') as Location,
  8. --dbo.[FN_SPLIT](data.Add_Date, 2, '=') as Add_Date
  9. --FROM (
  10. -- SELECT
  11. -- dbo.[FN_SPLIT](Details, 1, '|') as Name,
  12. -- dbo.[FN_SPLIT](Details, 2, '|') as Age,
  13. -- dbo.[FN_SPLIT](Details, 3, '|') as Job,
  14. -- dbo.[FN_SPLIT](Details, 4, '|') as Location,
  15. -- dbo.[FN_SPLIT](Details, 5, '|') as Add_Date
  16. -- FROM HR) data
  17.  
  18.  
  19.  
  20. CREATE FUNCTION [dbo].[FN_SPLIT] ( --SELECT DBO.FN_SPLIT('TEST1 , TEST2', 2, ',')
  21. @s varchar(512),
  22. @i int,
  23. @sep char(1) = ',')
  24. RETURNS varchar(512)
  25. AS
  26. BEGIN
  27. DECLARE @Ret VARCHAR(512);
  28.  
  29. WITH Pieces(pn, start, stop) AS (
  30. SELECT 1, 1, CHARINDEX(@sep, @s)
  31. UNION ALL
  32. SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
  33. FROM Pieces
  34. WHERE stop > 0
  35. )
  36. SELECT @Ret =
  37. RTRIM(SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END))
  38. FROM Pieces
  39. WHERE pn = @i
  40.  
  41. RETURN @Ret;
  42. END

沒有留言:

張貼留言