我有一个列mapping
的表,其中存储了记录:"IV=>0J,IV=>0Q,IV=>2,V=>0H,V=>0K,VI=>0R,VI=>1,"
检查子字符串是否在列映射中的sql是什么。 所以,我想这样:
"IV=>0J"
会返回true,因为IV=>0J
在字符串“mapping”中是完全正确的"IV=>01"
将返回false。等等...... 我试试这个:
SELECT * FROM table WHERE charindex('IV=>0J',mapping)
但是当我有"IV=>0"
时,它返回TRUE。但是,它应该返回FALSE。
谢谢..
答案 0 :(得分:4)
您可以使用逗号搜索。只需在mapping
的开头和结尾添加一个:
SELECT * FROM table WHERE charindex(',IV=>0J,',',' + mapping + ',') <> 0
或
SELECT * FROM table WHERE ',' + mapping + ',' LIKE '%,IV=>OJ,%'
答案 1 :(得分:2)
这应该可以解决问题:
SELECT * FROM table
WHERE
mapping LIKE '%,IV=>0J,%'
OR mapping LIKE '%,IV=>0J'
OR mapping LIKE 'IV=>0J,%'
OR mapping = 'IV=>0J'
但是你应该真正规范数据库 - 你当前违反了atomicity的原则,因此违反了1NF。您目前遇到的查询困难以及您将要遇到的未来性能问题都源于这个根本问题......
答案 2 :(得分:1)
虽然您可以通过在字符串中包含逗号进行搜索,但由于多种原因,这是一个糟糕的设计。
您应该将您的mapping
列标准化,方法是将数据提取到不同的映射表,至少包含您需要的From
和To
列。然后,您可以将这些列添加到索引中,仅使用单个索引搜索来转换查询。
您还可以将源表的ID值添加到Mappings
表和索引中。这将允许您将源行的查找转换为利用索引
答案 3 :(得分:0)
charindex返回文本的位置,而不是布尔值。
检查文本是否存在,与0比较:
SELECT * FROM table WHERE charindex('IV=>0J',mapping) <> 0
答案 4 :(得分:0)
我认为你在这里遗漏了一些东西, Charindex 函数不会返回TRUE或FALSE。 它返回主字符串中子字符串的起始点,或者如果子字符串不存在,则返回-1。 所以你应该查询,
SELECT * FROM table WHERE charindex('IV=>0J',mapping) > 0