SQL检查字符串中的子字符串

时间:2013-07-04 08:34:41

标签: sql sql-server

我有一个列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。

谢谢..

5 个答案:

答案 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)

虽然您可以通过在字符串中包含逗号进行搜索,但由于多种原因,这是一个糟糕的设计。

  • 您无法利用索引编制
  • 您强制对表进行全面扫描,这会导致性能下降和过度阻塞。
  • 您必须确保始终存在前导或尾随逗号(取决于您在LIKE表达式中的预期)。
  • 您不再能够编辑单个条目,每次想要更改单个映射时都必须替换整个字符串。
  • 如果有多个用户尝试更新恰好存储在同一列中的不同映射,那么你就会陷入并发噩梦。
  • 你的桌子不再是第一普通形式,这就是为什么你有这样的困难

您应该将您的mapping列标准化,方法是将数据提取到不同的映射表,至少包含您需要的FromTo列。然后,您可以将这些列添加到索引中,仅使用单个索引搜索来转换查询。

您还可以将源表的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