2012-02-19 38 views
2

我需要T-SQL的幫助。我在與查詢(樣本)我的SQL Server存儲過程如下:如何識別where子句中的哪個模式匹配

Select empid, empname, sal from emp 
    where empname like '%jo%' 
    and empname like '%el%' 

比方說,上面的查詢返回的記錄,如下圖所示:

empid empname sal 
17 john $1000 
45 elena $2000 

我需要有另一列上述選擇對於%jo%記錄應該說'jo''el'對於%el%記錄應該說。例如:

empid empname sal  SearchString 
17 john $1000 jo 
45 elena $2000 el 

這可能嗎?

感謝您與此類似

+0

您當前的where子句不會返回這兩行中的任何一行 - 「'john''與''%jo%''和''%el%''不同。我想你的意思是用'OR'而不是'AND'。你也可以指定你使用的是哪個版本的SQL Server? – 2012-02-19 15:51:14

+0

如果搜索字符串是'jo''和''oh'',你會想要什麼,它會匹配兩次john''?你想要兩行嗎,你想要「jo,el''要退還嗎?還是你想要選擇一個任意的? – 2012-02-19 16:01:24

回答

1

爲了滿足多個條件,您可以利用的CTE

  • 創建內存表
  • 將實際表連接到此內存表
  • 檢索條件SELECT子句中

SQL語句

;WITH Conditions (SearchString) AS (
    SELECT 'jo' UNION ALL 
    SELECT 'el' 
) 
SELECT empid 
     , empname 
     , sal 
     , Searchstring 
FROM emp e 
     INNER JOIN Conditions c ON e.empname LIKE '%' + c.SearchString + '%' 

測試腳本

;WITH Conditions (SearchString) AS (
    SELECT 'jo' UNION ALL 
    SELECT 'el' 
) 
, emp (empid, empname, sal) AS (
    SELECT 17, 'john', 1000 UNION ALL 
    SELECT 45, 'elena', 2000 
) 
SELECT empid 
     , empname 
     , sal 
     , Searchstring 
FROM emp e 
     INNER JOIN Conditions c ON e.empname LIKE '%' + c.SearchString + '%' 
+0

謝謝。你的測試腳本工作正常。我想知道如何在我的SP中實現這一點。我將搜索字符串作爲逗號分隔參數。 – Javeed 2012-02-19 12:59:09

+1

您在提問時應提及所有相關信息。這是相關信息。你有幾個選擇。 1.解析輸入參數(不好)。 2.將表變量類型傳遞給存儲過程(最好)3.傳遞XML參數(好)。這一切都取決於你是否可以改變你的sp被稱爲的方式,但這是你必須告訴我們的。 – 2012-02-19 13:03:49

+0

您的解決方案效果很好。謝謝 – Javeed 2012-02-19 16:55:58

1

東西會的工作,並指出,你可以在參數傳遞到存儲過程

declare @empname varchar(255) 
set @empname = 'jo' 

Select empid, empname, sal, @empname as searchstring from emp 
    where empname like '%'[email protected]+'%' 
+0

是的。值作爲一個逗號分隔值傳遞給SP,我分裂參數和構建查詢。但是,正如我在OP中所提到的,我有多個條件「其中emp%如'%jo%',而empname則是'%el%'」。 – Javeed 2012-02-19 12:55:26

0

它看起來像你想知道哪些搜索字符串匹配任何給定的輸出行。減少匹配多個搜索字符串的可能性,例如empname「喬爾」,下面應該工作:

declare @emp as table (empid int, empname varchar(10), sal money) 
insert into @emp (empid, empname, sal) values 
    (17, 'john', 1000), 
    (45, 'elena', 2000) 

select empid, empname, sal, 
    case 
    when empname like '%jo%' then 'jo' 
    when empname like '%el%' then 'el' 
    else '?' 
    end as SearchString 
    from @emp 
    where empname like '%jo%' or empname like '%el%' 
+0

挑戰在於創建'where'子句,因爲值作爲字符串(例如'jo,el')進入存儲過程而不是單獨的參數。 – 2012-02-19 16:05:00

+0

@AaronBertrand - 噢,這個要求不在OP中,而是作爲對另一個答案的評論而被埋沒。我的錯。雖然評論確實說明CSV字符串已被解析並用於構建查詢。 – HABO 2012-02-19 16:12:06

+0

這是三個小時前發佈的第一個答案的評論。儘管我同意OP在OP上列出了這個問題的相關信息,但在我們把答案寫在牆上之前,還需要閱讀其他答案和評論。 – 2012-02-19 16:13:52

0

首先,如果你需要解析逗號分隔的字符串,你應該有一個分流的功能。下面是我使用的一個:

CREATE FUNCTION [dbo].[SplitStrings] 
(
    @List  NVARCHAR(MAX) 
) 
RETURNS TABLE 
AS 
    RETURN (SELECT Item FROM (
    SELECT Item = x.i.value('(./text())[1]', 'nvarchar(max)') 
     FROM (SELECT [XML] = CONVERT(XML, '<i>' 
       + REPLACE(@List, ',', '</i><i>') 
       + '</i>').query('.')) AS a 
     CROSS APPLY [XML].nodes('i') AS x(i) 
    ) AS y WHERE Item IS NOT NULL 
    ); 
GO 

現在,假設你要挑多場比賽的情況下,任意搭配,你可以說:

CREATE PROCEDURE dbo.Search 
    @SearchStrings NVARCHAR(MAX) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    ;WITH x AS (
     SELECT e.empid, e.empname, e.sal, SearchString = s.Item, 
      rn = ROW_NUMBER() OVER (PARTITION BY e.empid ORDER BY s.Item) 
     FROM dbo.emp AS e 
     INNER JOIN dbo.SplitStrings(@SearchStrings) AS s 
     ON e.empname LIKE '%' + s.Item + '%' 
    ) 
    SELECT empid, empname, sal, SearchString 
    FROM x WHERE rn = 1 ORDER BY empid; 
END 
GO 

(這將返回第一個字母匹配您的@SearchStrings參數,而不是按逗號分隔的字符串順序排列的第一個匹配項。)

如果你只是希望所有的行,即使僱員出現在圖案傳遞的(這意味着如果你的參數是'jo,oh''john'將返回兩次)的不止一個,你可以說:

CREATE PROCEDURE dbo.Search 
    @SearchStrings NVARCHAR(MAX) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT e.empid, e.empname, e.sal, SearchString = s.Item 
     FROM dbo.emp AS e 
     INNER JOIN dbo.SplitStrings(@SearchStrings) AS s 
     ON e.empname LIKE '%' + s.Item + '%' 
     ORDER BY empid; 
END 
GO 

如果在多個模式與員工匹配的情況下需要用逗號分隔的匹配列表,請在您的要求中說明。這要做更多的工作。

相關問題