0

mapping我有一个包含存储记录的列的表:"IV=>0J,IV=>0Q,IV=>2,V=>0H,V=>0K,VI=>0R,VI=>1,"

检查子字符串是否在列映射中的sql是什么。所以,我想要这个:

  • 如果我有"IV=>0J"会返回真,因为IV=>0J在字符串“映射”中是准确的
  • 如果我有"IV=>01"会返回假。等等...

我试试这个:

SELECT * FROM table WHERE charindex('IV=>0J',mapping)

但是当我有时"IV=>0",它返回 TRUE。但是,它应该返回 FALSE。

谢谢你..

4

5 回答 5

4

您可以使用逗号进行搜索。只需在开头和结尾添加一个mapping

SELECT * FROM table WHERE charindex(',IV=>0J,',',' + mapping + ',') <> 0

或者

SELECT * FROM table WHERE ',' + mapping + ',' LIKE '%,IV=>OJ,%'
于 2013-07-04T08:43:02.797 回答
2

这应该可以解决问题:

SELECT * FROM table
WHERE
    mapping LIKE '%,IV=>0J,%'
    OR mapping LIKE '%,IV=>0J'
    OR mapping LIKE 'IV=>0J,%'
    OR mapping = 'IV=>0J'

但是您应该真正规范化数据库-您目前违反了原子性原则,因此违反了 1NF。您当前的查询困难以及您即将遇到的性能方面的未来困难都源于这个根本问题......

于 2013-07-04T08:54:54.733 回答
1

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

  • 您无法利用索引
  • 您强制对表进行全面扫描,这将导致性能不佳和过度阻塞。
  • 您必须确保始终有一个前导或尾随逗号(取决于您对 LIKE 表达式的期望)。
  • 您不再能够编辑单个条目,每次您想要更改甚至单个映射时都必须替换整个字符串。
  • 如果多个用户尝试更新恰好存储在同一列中的不同映射,您将面临并发噩梦。
  • 您的桌子甚至不再处于第一范式,这就是您遇到这些困难的原因

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

您还可以将源表的 ID 值添加到Mappings表和索引中。这将允许您将源行的查找转换为利用索引的两个表之间的连接

于 2013-07-04T08:54:36.880 回答
0

charindex 返回文本的位置,而不是布尔值。

要检查文本是否存在,请与 0 进行比较:

SELECT * FROM table WHERE charindex('IV=>0J',mapping) <> 0
于 2013-07-04T08:37:51.313 回答
0

我认为你在这里遗漏了一些东西,Charindex函数不返回 TRUE 或 FALSE。它返回主字符串中子字符串的起点,或者如果子字符串不存在,则返回 -1。所以你的查询应该阅读,

SELECT * FROM table WHERE charindex('IV=>0J',mapping) > 0
于 2013-07-04T08:44:21.770 回答