从DB中选择(并存储)包含特定列中某个字符的行的最有效方法

时间:2013-06-19 15:59:58

标签: sql sql-server database database-design

给定:具有字符串属性X的对象应存储在DB(MSSQL)中 重要事项:字符串属性是由大约0-30个不同的字符构建的。即这些字符来自定义的char池(包含那30个元素)。

E.g。池(稳定!)是:“A,N,H,J,K,L”。对象X1有“ANHL”,对象X2有“JHK”,对象X2有“N”......

问题:应用程序必须选择所有对象,例如X. 包含( 'N')。这将始终只有一个char

问题:如何有效地存储和/或选择这些对象?即存储为普通nvarchar字段并通过“like'%N%'选择不是一个选项!

3 个答案:

答案 0 :(得分:1)

对于集合中的每个字符,创建一个“BIT SPARSE”类型的列,并为每列创建一个过滤的非聚集索引(当然,该列的过滤器设置为“NOT NULL”)。

对于这种设置,您需要使聚簇索引键尽可能小。

答案 1 :(得分:0)

如果这是一个非常常见(经常执行)的sql语句,其中性能id非常重要,并且你要查找的1-char值N是常量,我会创建一个索引视图,或者放一个{{ 3}}。您可以创建一个计算列,该列返回布尔值1/0,具体取决于该字符是否在字符串属性中。

Alter table myTable
   Add Column HasA As
     (case CharIndex('A', stringAttribute) 
             When 0 Then 0 Else 1 End)
      Persisted            

如果N的值不是常数,但仅限于少数值之一,则可以为N可能的每个值创建一个持久计算列,每个值都有一个索引。

答案 2 :(得分:-1)

它是一种解决方法但应该有效

select *
from Table
where CHARINDEX('N', ColumnName, charindex('N', ColumnName) +1)  = 0

简单检查是否还有另一个' N'在第一个之后

在adventureworks数据库中我做了一个

select *
from Person.Person
where CHARINDEX('N', LastName, charindex('N', LastName) +1) >0

找到姓氏中包含的人超过1' N'

如果可能的话,我会更改表结构并创建1:n关系。第二个表只包含两列

ObjectId | Attribute

所以你可以通过简单的连接获得正确的对象

欢呼声