22,209
社区成员
发帖
与我相关
我的任务
分享
USE tempdb
GO
-------------- 增加按长度分隔表值函数 -----------------------
IF OBJECT_ID('dbo.Fun_SplitByLenStep1') IS NOT NULL
DROP FUNCTION dbo.Fun_SplitByLenStep1
GO
-- =============================================
-- Author: yenange
-- Create date: 2018-01-19
-- Description: 按长度分割字符串
-- =============================================
CREATE FUNCTION dbo.Fun_SplitByLenStep1
(
@str NVARCHAR(MAX),
@len INT
)
RETURNS TABLE
AS
RETURN
(
WITH cte AS (
SELECT 1 AS id FROM MASTER.dbo.spt_values AS sv WHERE sv.[type]='P'
AND sv.number BETWEEN 1 AND 1000 --如果字符串很长,可以去掉。限制这个主要是为了性能
),t2 AS (
SELECT ROW_NUMBER() OVER ( ORDER BY (SELECT 1)) AS rid FROM cte AS a CROSS APPLY cte AS b
)
SELECT SUBSTRING(@str,rid,@len) AS line FROM t2 WHERE rid<=len(@str)-1
)
GO
IF OBJECT_ID('a') IS NOT NULL DROP TABLE a
IF OBJECT_ID('b') IS NOT NULL DROP TABLE b
GO
CREATE TABLE a(
ID int,
姓名 nvarchar(20),
工作单位 NVARCHAR(20),
户口 NVARCHAR(20),
身份证号 VARCHAR(20),
合同开始时间 datetime,
合同起止时间 datetime
)
GO
CREATE TABLE b(
id INT,
姓名 nvarchar(20),
单位 nvarchar(20)
)
GO
INSERT INTO a(id,姓名,工作单位) values(1,'小明','好又多')
INSERT INTO a(id,姓名,工作单位) values(2,'小红','坏又少')
INSERT INTO b(id,姓名,单位) values(1,'小明','好又多超级市场')
INSERT INTO b(id,姓名,单位) values(2,'小明','好又多市场')
INSERT INTO b(id,姓名,单位) values(3,'小明','又多多')
INSERT INTO b(id,姓名,单位) values(4,'小明','故事又多了')
INSERT INTO b(id,姓名,单位) values(5,'小明','好又少超市')
SELECT a.id AS aId,a.姓名,a.工作单位,b.单位 FROM a INNER JOIN b
ON a.姓名=b.姓名 and exists(
select 1 from dbo.Fun_SplitByLenStep1(a.工作单位,2) as Ac
WHERE EXISTS(
SELECT 1 FROM dbo.Fun_SplitByLenStep1(b.单位,2) as Bc
WHERE ac.line=bc.line
)
)
/*
aId 姓名 工作单位 单位
----------- -------------------- -------------------- --------------------
1 小明 好又多 好又多超级市场
1 小明 好又多 好又多市场
1 小明 好又多 又多多
1 小明 好又多 故事又多了
1 小明 好又多 好又少超市
*/
USE tempdb
GO
-------------- 增加按长度分隔表值函数 -----------------------
IF OBJECT_ID('dbo.Fun_SplitByLenStep1') IS NOT NULL
DROP FUNCTION dbo.Fun_SplitByLenStep1
GO
-- =============================================
-- Author: yenange
-- Create date: 2018-01-19
-- Description: 按长度分割字符串
-- =============================================
CREATE FUNCTION dbo.Fun_SplitByLenStep1
(
@str NVARCHAR(MAX),
@len INT
)
RETURNS TABLE
AS
RETURN
(
WITH cte AS (
SELECT 1 AS id FROM MASTER.dbo.spt_values AS sv WHERE sv.[type]='P'
AND sv.number BETWEEN 1 AND 1000 --如果字符串很长,可以去掉。限制这个主要是为了性能
),t2 AS (
SELECT ROW_NUMBER() OVER ( ORDER BY (SELECT 1)) AS rid FROM cte AS a CROSS APPLY cte AS b
)
SELECT SUBSTRING(@str,rid,@len) AS line FROM t2 WHERE rid<=len(@str)-1
)
GO
IF OBJECT_ID('a') IS NOT NULL DROP TABLE a
IF OBJECT_ID('b') IS NOT NULL DROP TABLE b
GO
CREATE TABLE a(
ID int,
姓名 nvarchar(20),
工作单位 NVARCHAR(20),
户口 NVARCHAR(20),
身份证号 VARCHAR(20),
合同开始时间 datetime,
合同起止时间 datetime
)
GO
CREATE TABLE b(
id INT,
姓名 nvarchar(20),
单位 nvarchar(20)
)
GO
INSERT INTO a(id,姓名,工作单位) values(1,'小明','好又多')
INSERT INTO a(id,姓名,工作单位) values(2,'小红','坏又少')
INSERT INTO b(id,姓名,单位) values(1,'小明','好又多超级市场')
INSERT INTO b(id,姓名,单位) values(2,'小明','好又多市场')
INSERT INTO b(id,姓名,单位) values(3,'小明','又多多')
INSERT INTO b(id,姓名,单位) values(4,'小明','故事又多了')
INSERT INTO b(id,姓名,单位) values(5,'小明','好又少超市')
SELECT a.id AS aId,a.姓名,a.工作单位,b.单位 FROM a INNER JOIN b
ON a.姓名=b.姓名 and exists(
select 1 from dbo.Fun_SplitByLenStep1(a.工作单位,2) as Ac
WHERE EXISTS(
SELECT 1 FROM dbo.Fun_SplitByLenStep1(b.单位,2) as Bc
WHERE ac.line=bc.line
)
)
/*
aId 姓名 工作单位 单位
----------- -------------------- -------------------- --------------------
1 小明 好又多 好又多超级市场
1 小明 好又多 好又多市场
1 小明 好又多 又多多
1 小明 好又多 故事又多了
1 小明 好又多 好又少超市
*/
[/quote]
菜鸟有点看不懂,不过还是谢谢了,我慢慢研究一下USE tempdb
GO
IF OBJECT_ID('a') IS NOT NULL DROP TABLE a
IF OBJECT_ID('b') IS NOT NULL DROP TABLE b
GO
CREATE TABLE a(
ID int,
姓名 nvarchar(20),
工作单位 NVARCHAR(20),
户口 NVARCHAR(20),
身份证号 VARCHAR(20),
合同开始时间 datetime,
合同起止时间 datetime
)
GO
CREATE TABLE b(
id INT,
姓名 nvarchar(20),
单位 nvarchar(20)
)
GO
INSERT INTO a(id,姓名,工作单位) values(1,'小明','好又多')
INSERT INTO a(id,姓名,工作单位) values(2,'小红','坏又少')
INSERT INTO b(id,姓名,单位) values(1,'小明','好又多超级市场')
INSERT INTO b(id,姓名,单位) values(2,'小明','好又多市场')
SELECT a.id AS aId,a.姓名,a.工作单位,b.单位 FROM a INNER JOIN b
ON a.姓名=b.姓名 and left(a.工作单位,2)=left(b.单位,2)
/*
aId 姓名 工作单位 单位
1 小明 好又多 好又多超级市场
1 小明 好又多 好又多市场
*/