sql - 使用 Substring 或任何其他函数准确地选择一个字符串
问题描述
我在编写查询以选择字符串时被打动了。我发布的查询是示例数据
Declare @tbl table (tblname varchar(20),Query VARCHAR(MAX))
Insert into @tbl (tblname,Query) values ('Employee','select EmpId,
(Select top 1 Dept_ID from Stg.Dept
where Deptid = Deptid) Dept_ID,
(Select top 1 Dept_ID from Stg.Sub_dept
where Deptid = D.Deptid) SubDept_ID
from stg.Employee E
left join stg.Dept D
ON D.EMPID = E.EmpID
WHERE EMPID = (Select EMPID from stg.dept where Deptid = Deptid)')
查询:
select tblname,SUBSTRING(LTRIM(SUBSTRING(Query, CHARINDEX('FROM', Query)+4, LEN(Query))),
CHARINDEX('.', LTRIM(SUBSTRING(Query, CHARINDEX('FROM', Query)+4, LEN(Query))))+1,
CHARINDEX(' ',
SUBSTRING(LTRIM(SUBSTRING(Query, CHARINDEX('FROM', Query)+4, LEN(Query))),
CHARINDEX('.', LTRIM(SUBSTRING(Query, CHARINDEX('FROM', Query)+4, LEN(Query))))+1, LEN(Query)))-1) from
@tbl
结果:
tblname Req_tbl
Employee Dept
实际上,此查询是从该查询列中的子查询中选择stg.Dept表名。我真正想要的是拿起主表stg.Employee表。
输出:
tblname Req_tbl
Employee Employee
你能就此提出建议吗
解决方案
这不是 100% 清楚,但您尝试做的似乎是解析查询以确定是 @tbl.tblname 定义的对象。存在于带有 FROM 子句的查询中。例如 - 对于“员工”,您正在寻找“stg.employee”(不包括架构)。
如果我理解正确,您可以使用DelimitedSplit8K之类的拆分器轻松完成此操作,并执行以下操作:
Declare @tbl table (tblname varchar(20),Query VARCHAR(MAX))
Insert into @tbl (tblname,Query) values ('Employee','select EmpId,
(Select top 1 Dept_ID from Stg.Dept
where Deptid = Deptid) Dept_ID,
(Select top 1 Dept_ID from Stg.Sub_dept
where Deptid = D.Deptid) SubDept_ID
from stg.Employee E
left join stg.Dept D
ON D.EMPID = E.EmpID
WHERE EMPID = (Select EMPID from stg.dept where Deptid = Deptid)')
SELECT TOP (1) t.tblname, req_table = t.tblname
FROM @tbl AS t
CROSS APPLY dbo.delimitedSplit8K(t.Query,CHAR(10)) AS s
WHERE PATINDEX('%[^a-zA-Z]from %'+t.tblname+'%', s.item) > 0;
然而,这里的问题在于,取决于您的 T-SQL 代码的统一程度——这可能会变得复杂而棘手。
推荐阅读
- javascript - 从 puppeteer .innertext js 获取数据时遇到问题
- vue.js - Vue.js 超链接基于道具数据而改变
- matlab - 如何在matlab中居中对齐合适的列?
- java - 如何解决 JTree 中的显示问题?
- python - 将数据帧中的 600M 转换为 600,000,000 和 7K 转换为 7000
- c# - 使用瀑布方法 C# Bot 框架 V4 时从机器人提示符获取值
- telerik - RadGrid - 单击时不触发批量编辑模式
- c++ - 传递参数的问题
- java - Thymeleaf 不适用于驼峰类字段
- r - 两组观察值之间的成对差异