1

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

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

问题:应用程序必须选择所有带有例如 X. contains ('N') 的对象。这将永远只有一个 char

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

4

3 回答 3

1

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

对于这种设置,您将希望使您的聚集索引键尽可能小。

于 2013-06-19T16:50:53.080 回答
0

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

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

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

于 2013-06-19T16:19:13.773 回答
-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

这样您就可以通过简单的连接获得正确的对象

干杯

于 2013-06-19T16:16:24.173 回答