如何在WHERE子句中使用字符串的每个单词?

时间:2018-11-15 07:30:58

标签: c# sql sql-server stored-procedures

我遇到问题,在SQL Server 2014中有一个查询,查询结果应基于一个WHERE子句,该子句采用C#CheckedListBox中的字符串。
我有这种形式的字符串(以下值仅作为示例):-
cat,dog,bird,duck
在数据库内部,记录如下所示:-
dog cat-dog cat-dog-duck bird-dog-duck等...

我已经尝试过:-

DECLARE @animals nvarchar(max) = 'dog,bird,cat'
select x,y,z WHERE CHARINDEX(animals, replace(@animals,',',' ')) > 0

结果将仅显示诸如ONE SINGLE VALUE dog cat之类的bird行,但不会显示诸如dog-cat {{1} }等等!它仅显示来自dog-cat-bird字符串的带有单个单词的行。

如何从@animals字符串中选择列animals包含一个或多个单词的所有行。 预先感谢...

5 个答案:

答案 0 :(得分:2)

对于示例访问Query for convert CSV values into temp table,您应该创建一个临时表来存储所有搜索值,或者应该使用逗号分隔的变量创建临时表。然后使用内部联接对表中的记录进行过滤,如下所示。

declare @temp table (animal varchar(50))

insert into @temp values ('cat')
insert into @temp values ('dog')
insert into @temp values ('bird')


select * from SomeTable a
inner join @temp t on a.Column like '%' + t.animal + '%'

为该查询创建存储过程,然后从C#调用它。

答案 1 :(得分:1)

您应该看一下表值参数,它将使您将值表作为参数从c#发送到SQL。您使用“动物”制作表格,然后在“存储过程”中进行子选择。

从下面的链接中查看示例代码,展示如何传递参数:

 // Assumes connection is an open SqlConnection object.  
    using (connection)  
    {  
       // Create a DataTable with the modified rows.  
  DataTable addedCategories = CategoriesDataTable.GetChanges(DataRowState.Added);  

  // Configure the SqlCommand and SqlParameter.  
  SqlCommand insertCommand = new SqlCommand("usp_InsertCategories", connection);  
  insertCommand.CommandType = CommandType.StoredProcedure;  
  SqlParameter tvpParam = insertCommand.Parameters.AddWithValue("@tvpNewCategories", addedCategories);  
  tvpParam.SqlDbType = SqlDbType.Structured;  

  // Execute the command.  
  insertCommand.ExecuteNonQuery();  
    } 

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/table-valued-parameters

答案 2 :(得分:1)

  

在数据库内部,记录如下所示:-   狗猫狗猫狗鸭鸟狗鸭等

有问题的根源。在阅读我在答案中写的任何其他内容之前,您应该阅读Is storing a delimited list in a database column really that bad?,在那里您将看到很多原因,导致该问题的答案绝对是!

完成后,该问题的解决方案应该对我来说就显而易见了-修复数据库结构-意味着删除存储定界数据的列并将其替换为由许多引用的表与现有表格的多对多关系,它将为您保存动物数据。

解决方案的第一部分是使用表值参数,而不是将定界字符串发送到数据库。
关于如何在stackoverflow上执行此操作的示例很多,例如herethere

完成此操作后,可以使用like 的变通办法,以防万一您无法更改数据库结构:

SELECT <ColumnsList>
FROM <TableName> As T
JOIN @TVP As TVP
    ON '-' + T.Animals +'-' LIKE '%-' + TPV.Animal +'-%'

请注意,我已经在两列的两端添加了定界符。

如果您可以更改结构,则将有如下查询:

SELECT <ColumnsList>
FROM <TableName> As T
JOIN TableToAnimals AS TTA 
    ON T.Id = TTA.TableId
JOIN Aniamls AS A
    ON TTA.AnimalId = A.Id
JOIN @TVP As TVP
    ON A.Name = TVP.Animal

答案 3 :(得分:1)

对于有相同问题的任何人。我已经在SQL Server上找到了解决方案。
使用Full Text Search,您的问题很容易解决。这很棒。
检查以下链接:-
https://docs.microsoft.com/en-us/sql/relational-databases/search/get-started-with-full-text-search?view=sql-server-2017

答案 4 :(得分:0)

使用如下:

<mat-paginator [length]="count"