给定:具有字符串属性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%'选择不是一个选项!
答案 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
所以你可以通过简单的连接获得正确的对象
欢呼声