SQL Stored Procedure LIKE

后端 未结 7 1930
野的像风
野的像风 2021-02-20 11:38

This is a simple question and I can\'t seem to think of a solution.

I have this defined in my stored procedure:

@communityDesc varchar(255) = NULL


        
相关标签:
7条回答
  • 2021-02-20 12:17

    at first you most create a function to split string some thing like this code

    CREATE FUNCTION dbo.splitstring ( @stringToSplit VARCHAR(MAX) )
    RETURNS
     @returnList TABLE ([Name] [nvarchar] (500))
    AS
    BEGIN
    
     DECLARE @name NVARCHAR(255)
     DECLARE @pos INT
    
     WHILE CHARINDEX(',', @stringToSplit) > 0
     BEGIN
      SELECT @pos  = CHARINDEX(',', @stringToSplit)  
      SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)
    
      INSERT INTO @returnList 
      SELECT @name
    
      SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
     END
    
     INSERT INTO @returnList
     SELECT @stringToSplit
    
     RETURN
    END
    

    then you can use this function is your query like this

    WHERE AREA IN (dbo.splitstring(@communityDesc))
    
    0 讨论(0)
  • 2021-02-20 12:18

    A different approach is to use CHARINDEX(). However, using a function in a WHERE clause will slow down the performance.

    WHERE CHARINDEX(','+area+',',','+@CommunityDec+',')> 0
    

    If you area field is always 3 letters, you can simplify this.

    WHERE CHARINDEX(area,@CommunityDec)> 0
    

    This is a quick solution, but also a stop gap. A better solution is to change the string lookup approach to build a table with one row per search criteria and using a JOIN or sub query.

    0 讨论(0)
  • 2021-02-20 12:25

    The simplest way to use this variable is:

    SELECT * 
    FROM something
    WHERE ',' + @communityDesc + ',' Like '%,' + AREA + ',%'
    

    this is for tsql, for oracle use || to concatenate strings

    0 讨论(0)
  • 2021-02-20 12:31

    You can do this by splitting your string using a split function provided here. The function returns a table having a single column which holds your tokens (i.e. 'aaa', 'bbb' ...).

    Your query should look like this:

    -- get the splits
    SELECT Name INTO #someTemp
    FROM dbo.splitstring(@communityDesc)
    
    -- get data where area in within description
    SELECT 1
    FROM yourTable T
    WHERE EXISTS (SELECT 1 FROM #someTemp tmp WHERE T.Area = tmp.Name)  
    
    0 讨论(0)
  • 2021-02-20 12:35

    You can simply split this csv using XML and use this to filter in your query. No need to use a User defined function or @Table_Valiable or #Temp_Table here.

    DECLARE @xml as xml,@communityDesc varchar(255) = 'aaa,bbb,ccc'
    
    SET @xml = cast(('<X>'+replace(@communityDesc,',' ,'</X><X>')+'</X>') as xml)
    
    SELECT * FROM TABLE1
    WHERE AREA IN (
        SELECT N.value('.', 'varchar(10)') as value FROM @xml.nodes('X') as T(N)
    ) 
    

    If you required this split values in further process, then you can Insert this to a #table_Variable or #Temp_Table and use them.

    0 讨论(0)
  • 2021-02-20 12:36

    This article could help you by your problem:

    http://sqlperformance.com/2012/07/t-sql-queries/split-strings

    In this article Aaron Bertrand is writing about your problem. It's really long and very detailed.

    One Way would be this:

    CREATE FUNCTION dbo.SplitStrings_XML
    (
       @List       NVARCHAR(MAX),
       @Delimiter  NVARCHAR(255)
    )
    RETURNS TABLE
    WITH SCHEMABINDING
    AS
       RETURN 
       (  
          SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
          FROM 
          ( 
            SELECT x = CONVERT(XML, '<i>' 
              + REPLACE(@List, @Delimiter, '</i><i>') 
              + '</i>').query('.')
          ) AS a CROSS APPLY x.nodes('i') AS y(i)
       );
    GO
    

    With this function you only call:

    WHERE AREA IN (SELECT Item FROM dbo.SplitStrings_XML(@communityDesc, N','))
    

    Hope this could help you.

    0 讨论(0)
提交回复
热议问题