【问题标题】:Space separated string to create dynamic Sql query用空格分隔的字符串来创建动态 Sql 查询
【发布时间】:2014-06-11 20:39:39
【问题描述】:

我有一个空格分隔的字符串作为我的 SP 的参数。我需要拆分字符串并将每个字符串与数据库中的一列以及通配符进行比较并返回结果。

例如:

我有 CompanyName 'ABC DataServices Pvt Ltd' 我需要用“空格”分割字符串,并将每个单词与数据库字段公司名称与OR 条件进行比较。

类似这样的:

select * 
from CompanyTable 
where companyname like '%ABC%' 
    or companyname like '%DataServices%' 
    or companyname like '%Pvt%' 
    or companyname like '%Ltd%'

有人可以帮我实现这一目标吗?

提前致谢

【问题讨论】:

    标签: sql-server-2008


    【解决方案1】:

    尝试this SQL 用户定义函数来解析分隔字符串很有帮助。

    对于快速解决方案使用这个,

    SELECT PARSENAME(REPLACE('ABC DataServices Pvt Ltd', ' ', '.'), 2) // return DataServices
    

    PARSENAME 接受一个字符串并将其拆分为句点字符。它需要一个数字作为第二个参数,该数字指定要返回的字符串的哪一段(从后到前)。 你可以把你想要的索引代替上面的 2 像

    SELECT PARSENAME(REPLACE('ABC DataServices Pvt Ltd', ' ', '.'), 3)  --return Pvt
    

    在你的存储过程中声明一个字符串并使用设置这个值给它。在你想要的地方使用。 唯一的问题是字符串已经包含句点。需要注意的一点是,PARSENAME 只需要四个部分,因此使用超过四个部分的字符串会导致它返回 NULL

    【讨论】:

      【解决方案2】:

      试试这个功能:

      CREATE FUNCTION [dbo].[fnSplitString] 
      ( 
      @string NVARCHAR(MAX), 
      @delimiter CHAR(1) 
      ) 
      RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
      ) 
      BEGIN 
      DECLARE @start INT, @end INT 
      SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
      WHILE @start < LEN(@string) + 1 BEGIN 
          IF @end = 0  
              SET @end = LEN(@string) + 1
      
          INSERT INTO @output (splitdata)  
          VALUES(SUBSTRING(@string, @start, @end - @start)) 
          SET @start = @end + 1 
          SET @end = CHARINDEX(@delimiter, @string, @start)
      
      END 
      RETURN 
      END
      

      并像这样使用它:

      select * from dbo.fnSplitString('Querying SQL Server','')
      

      【讨论】:

        【解决方案3】:

        这将扩展到任意数量的搜索词,并且不需要动态 SQL。

        declare @a table (w varchar(50)) -- holds original string
        declare @b table (s varchar(50)) -- holds parsed string
        
        insert into @a -- load string into temp table
        values ('ABC DataServices Pvt Ltd')
        
        --parse string as XML
        ;WITH Vals AS (
                SELECT  w,
                        CAST('<d>' + REPLACE(w, ' ', '</d><d>') + '</d>' AS XML) XmlColumn
                FROM    @a
        )
        
        
        --Insert results to parsed string
        insert into @b
        SELECT  
                C.value('.','varchar(max)') ColumnValue
        FROM    Vals
        CROSS APPLY Vals.XmlColumn.nodes('/d') AS T(C)
        
        
        --Join on results
        select * from companytable
        join @b b on b.s like '%'+companyname+'%'
        

        【讨论】:

        • XML 解析器无耻地从 stackoverflow.com/a/4267183/2587452 那里偷走了。如果您需要更高的性能,您可以使用临时表来存储拆分结果并对其进行索引。
        【解决方案4】:

        你也可以试试这个。

        首先在参数值中用逗号 (,) 替换空格,然后用期望的 where 条件替换逗号 -

        DECLARE @companyname VARCHAR(1000)
            ,@where VARCHAR(max)
        
        SET @companyname = 'ABC DataServices Pvt Ltd'
        SET @companyname = replace(@companyname, ' ', ', ')
        
        SELECT @where = 'companyname like ''%' + 
        REPLACE(@companyname, ', ', '%'' OR companyname like ''%') + '%'''
        
        PRINT @where
        
        PRINT ('SELECT * FROM CompanyTable WHERE' + @where)
        --EXEC ('SELECT * FROM CompanyTable WHERE' + @where)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多