首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >T-SQL:如何过滤' ab,ab‘而不是'ab,ab'?

T-SQL:如何过滤' ab,ab‘而不是'ab,ab'?
EN

Stack Overflow用户
提问于 2012-01-17 13:26:48
回答 2查看 77关注 0票数 1

如果这个问题不清楚,很抱歉。简短的故事是,我们有人犯了一些错误,导致了一个相当糟糕的数据损坏问题。最终的结果是,我们最终得到了一堆t-sql条目,它们看起来类似于:“value,value,value”和“this,is a value,this is a value”,它们有几千种不同(超过110k条记录受到影响)。

问题是,我们需要使用SQL WHERE子句来匹配包含逗号的项,这些项位于字符串中除空格以外的任何字符(或缺少字符)的任何位置。作为示例,我创建了一些下面的项表,其中包含一个位,指示查询是否应该返回给定的项。

代码语言:javascript
运行
复制
DECLARE @Ttests Table (  
  toMatch varchar(4000),
  shouldMatch bit
)
INSERT INTO @Ttests 
VALUES 
  ('value1,value2,value3,value1,value2,value3', 1),
  ('value1, value2, value3', 0),  
  (',value1, value2, value3', 1),  --starts with a comma
  ('value1, value2,value2', 1),
  ('this, is a sentence,this, is a sentence', 1),
  ('value1, value2, value3,', 1),  -- ends in a comma
  ('value1 ,value2, value3', 0);

今晚我能得到的最接近的信息是这样的:

代码语言:javascript
运行
复制
SELECT
 *  
FROM @Ttests
WHERE PatIndex('[^ ]%,[^ ]%', toMatch) > 0
   OR PatIndex(',%', toMatch) > 0
   OR PatIndex('%,', toMatch) > 0

但是,它在最后一项上返回一个假匹配。有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-17 13:36:28

我想你的'%‘和'^’在你的第一个PatIndex中换错了方向

代码语言:javascript
运行
复制
SELECT
 *  
FROM @Ttests
WHERE PatIndex('%[^ ],[^ ]%', toMatch) > 0
   OR PatIndex(',%', toMatch) > 0
   OR PatIndex('%,', toMatch) > 0
票数 2
EN

Stack Overflow用户

发布于 2012-01-17 13:40:45

尝试以下操作:

代码语言:javascript
运行
复制
SELECT *  
FROM @Ttests
WHERE
(
    toMatch LIKE '%[^ ],[^ ]%'
    OR toMatch LIKE ',[^ ]%'
    OR toMatch  LIKE '%[^ ],'
)

几乎相同:

代码语言:javascript
运行
复制
SELECT *  
FROM @Ttests
WHERE 
    PatIndex('%[^ ],[^ ]%', toMatch) > 0
OR  PatIndex(',[^ ]%', toMatch) > 0
OR  PatIndex('%[^ ],', toMatch) > 0
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8890089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档