首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL替换WHERE子句

SQL替换WHERE子句
EN

Stack Overflow用户
提问于 2017-02-22 12:37:07
回答 3查看 1.7K关注 0票数 4

我们有下面的查询,它是用HTML的等价物(&)替换memo字段中的任何&。在编写时,我们没有考虑到字段中可能还有其他也以“&”开头的HTML标记(即-“etc)。因为我们必须确保当单独使用而不是另一个标记的一部分时,所有的&符号都是HTML等价的,所以我们必须跳过那些位于另一个标记的部分的和符号。也就是说,可以以&开头的最短的HTML标记看起来是3个字符,最长的是6个字符,所以&___;到&___的长度...有没有什么想法可以更新where子句,使它不更新任何&,这些&在&之后的4-7个字符中以";“开头?谢谢。

代码语言:javascript
复制
 UPDATE STOCKMEM
 SET INETFDESC = CAST(
                       REPLACE(
                               REPLACE(
                                       CAST(INETFDESC as NVarchar(MAX))
                               ,'&','&')
                       , '&', ,'&')AS NText)
  WHERE INETFDESC LIKE '%&[^amp;]%' 
EN

回答 3

Stack Overflow用户

发布于 2017-02-22 15:32:00

可能不是解决这个问题的最好方法,但是...

您可以使用下划线_作为在该位置应该有一些字符的指示符,这在这种情况下可以有效地使其成为字符计数器。这只是一个简单的例子:

代码语言:javascript
复制
SELECT REPLACE('This is &[^amp;] just a test.','&[^amp;]','&')
WHERE 'This is &[^amp;] just a test.' LIKE '%&___;%'

这不会返回值,因为WHERE子句中的字符串不包括&后跟三个字符_ _ _,后跟分号。

代码语言:javascript
复制
SELECT REPLACE('This is &[^amp;] just a test.','&[^amp;]','&')
WHERE 'This is &[^amp;] just a test.' LIKE '%&_____;%' 

这将返回一个值,因为WHERE子句中的字符串满足LIKE条件:&_ _ _ _ _; (为清楚起见添加了空格)

也许你可以利用这一点?

票数 0
EN

Stack Overflow用户

发布于 2017-03-02 21:05:41

这并不美观,但我认为它能做好工作。这个想法是找到所有不是实体的一部分的和号。在这里,实体被假定为与符号,一个字母,多一些字符,然后是分列。

代码语言:javascript
复制
set nocount on
--drop table #HtmlTest
select CONVERT( nvarchar(255) , 
  N'The & & z; HTML & replacement < > é ε test & a; ' )   as test
  into #HtmlTest

select test from #HtmlTest

declare @posStart int, @posStart1 int, @posStart2 int, @posEnd int, @isEntity bit
set @posStart = 1 

while (@posStart != 0)
  begin
    select @posStart1 = charindex('&', test, @posStart + 1)  from #HtmlTest
    select @posStart2 
        = patindex('%&[a-z]%;%', substring(test, @posStart + 1, 99999)) 
        + @posStart    from #HtmlTest
    set    @isEntity  = IIF(@posStart1 = @posStart2, 1, 0)
    select @posEnd    = charindex(';', test, @posStart1 + 1) from #HtmlTest

    set @posStart = @posStart1

    if (@isEntity = 0 and @posStart1 > 0) 
      begin
        update #HtmlTest 
          set test = SUBSTRING(test, 1, @posStart1 - 1) + '&' 
                   + SUBSTRING(test, @posStart1 + 1, 999999) 
        select test from #HtmlTest
        set @posStart += 4
      end
  end
select test from #HtmlTest
set nocount off
票数 0
EN

Stack Overflow用户

发布于 2018-03-05 05:54:46

我认为这将完成这项工作:

代码语言:javascript
复制
 UPDATE STOCKMEM
 SET INETFDESC = CAST(
                 REPLACE(
                     CAST(INETFDESC as NVarchar(MAX)), '& ', '&amp ')
                 ) AS NText
              )

如果&是任何标记的一部分,那么它后面不会跟空格,所以请将后面跟着空格的每个&替换为后面跟着空格的&amp

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42382807

复制
相关文章

相似问题

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