我在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'
[及其变体]位,其他所有内容都需要保留,因为它当前是)。
答案 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中的一些正则表达式支持将有很长的路要走。