Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何识别where子句中匹配的模式_Sql_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

Sql 如何识别where子句中匹配的模式

Sql 如何识别where子句中匹配的模式,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,我需要关于T-SQL的帮助。我的SQL Server中有一个存储过程,其查询(示例)如下: Select empid, empname, sal from emp where empname like '%jo%' and empname like '%el%' 假设上面的查询返回如下所示的记录: empid empname sal 17 john $1000 45 elena $2000 我需要在上面的select语句中添加另一列,对于%jo%记录,

我需要关于T-SQL的帮助。我的SQL Server中有一个存储过程,其查询(示例)如下:

Select empid, empname, sal from emp
  where empname like '%jo%'
  and   empname like '%el%'
假设上面的查询返回如下所示的记录:

empid empname sal   
17    john    $1000
45    elena   $2000
我需要在上面的select语句中添加另一列,对于
%jo%
记录,它应该是
'jo'
,对于
%el%
记录,它应该是
'el'
。例如:

empid empname sal     SearchString
17    john    $1000   jo
45    elena   $2000   el
这可能吗


谢谢

类似于此的操作将起作用,注意您可以将参数传递给存储的进程

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

Select empid, empname, sal, @empname as searchstring from emp 
  where empname like '%'+@empname+'%'

为了适应多种情况,您可以使用
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 + '%'
测试脚本

;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 + '%'

看起来您想知道哪个搜索字符串与任何给定的输出行匹配。不考虑匹配多个搜索字符串的可能性,例如
empname
'Joel',以下操作应该有效:

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%'

首先,如果需要解析逗号分隔的字符串,那么应该有一个split函数。下面是我使用的一个:

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
(这将返回
@SearchStrings
参数中的第一个字母匹配,而不是按逗号分隔字符串的顺序返回的第一个匹配。)

如果您只需要所有行,即使一名员工出现在传递的模式中不止一个(这意味着如果您的参数是
'jo,oh'
,则
'jon'
将返回两次),您也可以说:

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

若在多个模式匹配一名员工的情况下,您需要一个逗号分隔的匹配列表,请在您的要求中说明。要做到这一点还需要一点工作。

是的。这些值作为逗号分隔的值传递给SP,我正在拆分参数并构造查询。但是,正如我在OP中提到的,我有多个条件“其中empname像“%jo%”和empname像“%el%”。谢谢。您的测试脚本工作正常。我想知道如何在我的SP中实现这一点。我将searchstrings作为逗号分隔的参数获取。在提问时,您应该提及所有相关信息。那是相关的消息。你有几个选择。1.解析输入参数(不好)。2.将表变量类型传递给存储过程(best)3。传递一个XML参数(好)。这完全取决于您是否可以更改sp的调用方式,但这是您必须告诉我们的。@Javeed您能解释一下吗?如何将
'jo,el'
传递到您的过程中?对我来说,您面临的主要挑战似乎是将逗号分隔的字符串转换为不同的值。我不想从这个答案中拿走任何东西,但我不确定它是如何解决这个问题的。我已经解析了输入参数。这解决了我原来的问题。您当前的where子句不会返回这两行中的任何一行-
'john'
'%jo%'
'%el%'
都不一样。我想你是想用
而不是
。您还可以指定您正在使用哪个版本的SQL Server吗?如果搜索字符串是将匹配两次的
'jo'
'oh'
,您想要什么?您想要两行,是想要返回
'jo,el'
,还是想要选择任意一行?挑战是创建
where
子句,因为值作为字符串(例如
jo,el
)进入存储过程,而不是作为单个参数。@AaronBertrand-哦,这个要求不在OP中,但作为对另一个答案的评论。我的错。尽管评论中确实指出CSV字符串已经被解析并用于动态构造查询,但这是对三个多小时前发布的第一个答案的评论。虽然我同意OP上应该包含关于这个问题的信息,但我们也应该在把答案扔到墙上之前阅读其他答案和评论。