在列字段

时间:2018-03-11 21:20:11

标签: sql sql-server

在我的表中,特定列值以三种不同的方式存储,如下所示。它可以是由逗号分隔的一个,两个或三个项目(当然,如果有多个值)。最小值为一个值,最多3个值以逗号分隔。要清楚我知道它的坏方法已经完成(不是由我)但是我必须努力解决这个问题而且我只需要改变这个查询。显示存储值的三种方法的示例:

MaterialAttributes  (column name)
----------------------------------
1,12,32
3,1
9

我有特定的SQL查询用于搜索字段中是否存在某个值。检查所有树的方式是通用的。

somevalue1

或:

somevalue1,somevalue2

或:

somevalue1,somevalue2,somevalue3

因此,例如,如果我在整个表中搜索该列中的每一行以获取somevalue2出现的记录,则此查询正确地给出了正确的结果。

这是查询:

";WITH spacesdeleted (vater, matatt) as (SELECT vater, REPLACE(MaterialAttributes, ' ', '') MaterialAttributes FROM myTable),
matattrfiltered (vat) as (SELECT vater FROM spacesdeleted WHERE matatt = @matAttrId
          OR matatt LIKE @matAttrId +',%'
          OR matatt LIKE '%,'+@matAttrId
          OR matatt LIKE '%,'+@matAttrId+',%' ),
dictinctVaters (disc_vats) as (SELECT distinct(vat) FROM matattrfiltered)
SELECT ID from T_Artikel WHERE Vater IN (SELECT disc_vats FROM dictinctVaters)"

注意:出于安全原因,如果由于某些原因,逗号附近有空格,则会删除(仅来自其他开发者的信息)。

问题是什么: 现在的问题是逻辑改变的方式可能而不是3(最大) - 12存储在该列中。

2 个答案:

答案 0 :(得分:0)

                    OR matatt LIKE @matAttrId +',%' 
                    OR matatt LIKE @matAttrId +',%'    

这些是相同的,如果一个是'%,'+ @matAttrId?

无论如何,我认为只需要4个案例:

 = @matAttrId
 LIKE @matAttrId + ',%'
 LIKE '%,' +@matAttrId
 LIKE '%,' +@matAttrId + ',%'

覆盖

  
      
  1. 单一值,等于
  2.   
  3. value是列表的开头
  4.   
  5. value是列表的结尾
  6.   
  7. 值位于列表中间
  8.   

您的原始查询已经存在。

答案 1 :(得分:0)

您可以使用

进行搜索
WHERE ',' + matatt + ',' LIKE '%,' + @matAttrId + ',%'

它的工作方式如下:matatt扩展为看起来像这样

,1,12,32,
,3,1,
,9,

现在,您可以使用搜索模式,id,来搜索类似%,id,%的ID,其中id是真实身份。

这适用于每列的任意数量的值。