T-SQL中的APPLY用法
Posted 咕咚
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了T-SQL中的APPLY用法相关的知识,希望对你有一定的参考价值。
上周和team leader 讨论问题的时候,
发现自己连 sqlserver 中的 apply 都不会用,赶快,今天来恶补一哈;
sql 脚本准备;
IF object_id(\'dbo.Product\') IS NOT NULL DROP TABLE dbo.Product; IF object_id(\'dbo.SearchString\') IS NOT NULL DROP TABLE dbo.SearchString; IF object_id(\'dbo.FindProductLike\') IS NOT NULL DROP FUNCTION dbo.FindProductLike; CREATE TABLE dbo.Product ( ID INT IDENTITY , ProductNameVARCHAR(100) , Price MONEY ); INSERT INTO dbo.Product VALUES ( \'Red SantaSuit\', 199.99 ), ( \'Candy Canes\', 1.99 ), ( \'Fake Snow\', 2.99 ), ( \'Red Bells\', 49.99 ), ( \'LED Lights\', 6.99 ); CREATE TABLE dbo.SearchString ( ID INT IDENTITY , String VARCHAR(100) ); INSERT INTO dbo.SearchString VALUES ( \'Red\' ), ( \'Lights\' ), ( \'Star\' ); GO
还记得模糊查询吧,如果,我们定义查询的关键字为:
Red
Lights
Star
我们的sql可能会这么写;
SELECT * FROM Product WHERE ProductName LIKE \'%\' + \'Red\' + \'%\' SELECT * FROM Product WHERE ProductName LIKE \'%\' + \'Lights\' + \'%\' SELECT * FROM Product WHERE ProductName LIKE \'%\' + \'Star\' + \'%\'
当然 你可以可以 用多个 or 或者uion all 来 或者,动态sql 来拼接;
然后如果我增加,更过多的关键字呢,然后...........
我们可以考虑这样做;建立一个ForSearch表,然后....
CROSS APPLY 就出场啦,
它会对相关联的每一行都应用该函数;
我们先建立一个函数
CREATE FUNCTION SEARCHINFO ( @KEYWORD VARCHAR(100) ) RETURNS TABLE ---这里是我们的returns ---不是 return 多了个s AS RETURN ( SELECT ProductName, Price FROM Product WHERE ProductName like \'%\' + @KEYWORD +\'%\' ) GO
然后我们将该函数,应用到 SearchString 表中的 String 字段中的,每一个值(行),并返回 于 SearchString 表相关联;
SELECT * FROM SearchString AS S CROSS APPLY SEARCHINFO(S.String)
结果:
今后,我们就可以将要查询的关键字,存放在我们的 SearchString 表中,然后应用我们的 apply 和 SEARCHINFO 函数
该操作符和CROSS APPLY的唯一区别是返回所有数据,包括没有匹配的值;
也就是我们的Star 会别列出来,
效果如图:
我们也可以直接这样写:
SELECT * FROM SearchString AS S CROSS APPLY ( SELECT ProductName, Price FROM Product WHERE ProductName like \'%\' + S.String + \'%\' ) AS X
完美,再见,下班,回家
参考文献:http://blog.csdn.net/dba_huangzj/article/details/48545951
这边文章,基本是按照文献写的,但是看了之后,梳理思路,自己再写一遍,效果会很好滴呀;
以上是关于T-SQL中的APPLY用法的主要内容,如果未能解决你的问题,请参考以下文章
pandas GroupBy上的方法apply:一般性的“拆分-应用-合并”