看看Linoff编写的以下SQL代码:
approach used by Taryn for SQL concatenation
SELECT a.*,
(SELECT STUFF( (SELECT DISTINCT '; ' + r.[description]
FROM [tdt_AD_Teste] r
WHERE a.pid = r.pid AND
r.[displayname] = 'member'
FOR XML PATH('')
), 1, 2, ''
)
) Descript
FROM (SELECT a.pid,
MAX(CASE WHEN a.displayname = 'name' then [group] end) as name,
MAX(CASE WHEN a.displayname = 'sd' then [group] end) as sd,
MAX(CASE WHEN a.displayname = 'description' then [group] end) as description
FROM tdt_AD_Teste a
GROUP BY a.pid
) a;
此代码将生成5列:pid;名称; sd;描述;描述
我要搜索描述符部分(这是一个别名)...
如果我们写成:
where [Descript] like '%' + '<any_value>'+ '%'
它将抛出无效的列名称'Descript'(查找pid,sd,描述和名称很容易)。
如果我编写的代码与您在上面看到的相同......用包裹,从(代码)b中选择*,其中(...)
SELECT *
FROM
(
SELECT a.*,
(SELECT STUFF( (SELECT DISTINCT '; ' + r.[description]
FROM [tdt_AD_Teste] r
WHERE a.pid = r.pid AND
r.[displayname] = 'member'
FOR XML PATH('')
), 1, 2, ''
)
) Descript
FROM (SELECT a.pid,
MAX(CASE WHEN a.displayname = 'name' then [group] end) as name,
MAX(CASE WHEN a.displayname = 'sd' then [group] end) as sd,
MAX(CASE WHEN a.displayname = 'description' then [group] end) as description
FROM tdt_AD_Teste a
GROUP BY a.pid
) a ) b
WHERE b.Descript like '%' + '<any_value> + '%' ;
它可以工作,但是找到一些字符串需要太多时间....(可能需要20 s ...)。有没有一种更快的方法来搜索这种情况?
答案 0 :(得分:2)
您不必生成字符串-假设您要查找的是一行描述。您可以这样做:
SELECT a.pid,
MAX(CASE WHEN a.displayname = 'name' then [group] end) as name,
MAX(CASE WHEN a.displayname = 'sd' then [group] end) as sd,
MAX(CASE WHEN a.displayname = 'description' then [group] end) as description
FROM tdt_AD_Teste a
GROUP BY a.pid
HAVING SUM(CASE WHEN description LIKE '%' + <any value> + '%' THEN 1 ELSE 0 END) > 0;
您可以在FROM
的子查询中使用它,然后将外部查询中的描述连接起来。