SQL Server:是否可以简化以下查询WHERE子句?

时间:2014-11-17 15:25:41

标签: sql sql-server tsql sql-server-2008-r2

我在WHERE子句中有十个条件(带有OR)的SQL查询。

DECLARE @profile TABLE (content VARCHAR(MAX))
INSERT INTO @profile(content)
VALUES ('<some_text>dbo.ConcatenateTitles([title].title_id,59<some_text>')
, ('<some_text>dbo.ConcatenateTitles(title.[title_id],59<some_text>')
, ('<some_text>dbo.ConcatenateTitles( title.title_id,59<some_text>')
, ('<some_text>dbo.ConcatenateTitles( title.title_id, 59<some_text>')
, ('<some_text>dbo.ConcatenateTitles( [title].[title_id],59<some_text>')
, ('<some_text>dbo.ConcatenateTitles( [title].[title_id], 59<some_text>')
, ('<some_text>dbo.ConcatenateTitles( title.title_id ,59<some_text>')
, ('<some_text>dbo.ConcatenateTitles( title.title_id , 59<some_text>')
, ('<some_text>dbo.ConcatenateTitles( [title].[title_id] ,59<some_text>')
, ('<some_text>dbo.ConcatenateTitles( [title].[title_id] , 59<some_text>')
--SELECT * FROM @profile

SELECT * FROM @profile
WHERE 1=1 AND 
(
       content LIKE '%dbo.ConcatenateTitles(/[title].title_id,59%' ESCAPE '/'
    OR content LIKE '%dbo.ConcatenateTitles(title./[title_id],59%' ESCAPE '/'
    OR content LIKE '%dbo.ConcatenateTitles( title.title_id,59%' ESCAPE '/'
    OR content LIKE '%dbo.ConcatenateTitles( title.title_id, 59%' ESCAPE '/'
    OR content LIKE '%dbo.ConcatenateTitles( /[title]./[title_id],59%' ESCAPE '/'
    OR content LIKE '%dbo.ConcatenateTitles( /[title]./[title_id], 59%' ESCAPE '/'
    OR content LIKE '%dbo.ConcatenateTitles( title.title_id ,59%' ESCAPE '/'
    OR content LIKE '%dbo.ConcatenateTitles( title.title_id , 59%' ESCAPE '/'
    OR content LIKE '%dbo.ConcatenateTitles( /[title]./[title_id] ,59%' ESCAPE '/'
    OR content LIKE '%dbo.ConcatenateTitles( /[title]./[title_id] , 59%' ESCAPE '/'   
)

OR分隔的所有条件都相似(但有一个额外的空格或[个字符)。是否可以将这十个条件简化为一个或两个条件(例如,使用PATINDEX)?

编辑: 为了解一下我想要实现的目标:

MyTable(MyTable_id INT , Content varchar(max))

数据类似于上面TABLE变量中指定的数据。

我需要用'dbo.ConcatenateTitles(title.title_id,59'替换](及其变体,带有空格或'dbo.ConcatenateTitles(title.title_id,4')的出现率 我已经使用上面的查询来查找将受影响的行数(150行中受影响的行数为800行),并考虑为每个变体运行一个更新语句。

UPDATE MyTable SET content = REPLACE(content, 'dbo.ConcatenateTitles(title.title_id,59', 'dbo.ConcatenateTitles(title.title_id,4')
WHERE content LIKE '%dbo.ConcatenateTitles(title.title_id,59%'

有更好的选择吗?我不想更改列的其他内容(即除了'dbo.ConcatenateTitles(title.title_id,59' [及其变体]位,其他所有内容都需要保留,因为它当前是)。

1 个答案:

答案 0 :(得分:1)

我怀疑以下可能是你想要的:

   replace(replace(replace(content, ' ', ''), ']', ''), '[', '') LIKE
       '%dbo.ConcatenateTitles(title.title_id,59%' ESCAPE '/'

当然,这不完全正确。更接近的方法是:

   replace(replace(replace(replace(content, '[title]', 'title'
                                  ), '[title_id]', 'title_id'
                          ), ', ', ',')
                  ), ' ,', ',')
          ), '( ', '(') LIKE
       '%dbo.ConcatenateTitles(title.title_id,59%' ESCAPE '/'

作为旁注:SQL Server中的一些正则表达式支持将有很长的路要走。