在我的表中,特定列值以三种不同的方式存储,如下所示。它可以是由逗号分隔的一个,两个或三个项目(当然,如果有多个值)。最小值为一个值,最多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存储在该列中。
答案 0 :(得分:0)
OR matatt LIKE @matAttrId +',%'
OR matatt LIKE @matAttrId +',%'
这些是相同的,如果一个是'%,'+ @matAttrId?
无论如何,我认为只需要4个案例:
= @matAttrId
LIKE @matAttrId + ',%'
LIKE '%,' +@matAttrId
LIKE '%,' +@matAttrId + ',%'
覆盖
- 单一值,等于
- value是列表的开头
- value是列表的结尾
- 值位于列表中间
醇>
您的原始查询已经存在。
答案 1 :(得分:0)
您可以使用
进行搜索WHERE ',' + matatt + ',' LIKE '%,' + @matAttrId + ',%'
它的工作方式如下:matatt
扩展为看起来像这样
,1,12,32,
,3,1,
,9,
现在,您可以使用搜索模式,id,
来搜索类似%,id,%
的ID,其中id
是真实身份。
这适用于每列的任意数量的值。