You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PowerShell提取SQL查询中JOIN关键字后的表名?

提取SQL语句中JOIN关键字后的表名(PowerShell实现)

首先明确你的需求:从这段SQL片段里提取所有JOIN(包括带前缀的比如INNER JOIN)后面的表名:

FROM TableA INNER JOIN TableB ON TableA.xx = TableB.xx INNER JOIN TableC ON TableA.yy = TableC.yy

你之前的脚本思路没问题,但在正则匹配和内容处理上有可以优化的地方,我帮你调整完善一下:

修正后的完整脚本

# 读取SQL文件内容,合并为单行并统一格式处理
$sqlContent = (Get-Content -Path query1.txt -Raw).ToLower() -replace '\s+', ' '

# 使用正则匹配所有JOIN后的表名(兼容INNER/LEFT/RIGHT/FULL JOIN等前缀场景)
$joinTableMatches = [regex]::Matches($sqlContent, '(?:inner|left|right|full)\s+join\s+(\w+)|join\s+(\w+)')

# 提取匹配到的表名,过滤空值并去重后输出
$joinTables = $joinTableMatches | ForEach-Object {
    # 取第一个非空的捕获组(适配带前缀和不带前缀的JOIN两种情况)
    $_.Groups[1].Value -or $_.Groups[2].Value
} | Where-Object { $_ } | Select-Object -Unique

# 打印结果
Write-Host "提取到的JOIN关联表名:"
$joinTables | ForEach-Object { Write-Host "- $_" }

关键逻辑说明

  • 内容预处理:用-Raw参数读取整个文件为单行字符串,避免多行拆分导致的匹配遗漏;转小写并替换所有连续空格为单空格,让正则匹配更稳定。
  • 正则匹配逻辑:正则表达式(?:inner|left|right|full)\s+join\s+(\w+)|join\s+(\w+)会覆盖两种场景:
    1. 带前缀的JOIN(比如INNER JOIN),精准捕获后面的表名
    2. 无前置修饰词的JOIN,同样捕获表名
  • 结果处理:遍历所有匹配结果,取出有效表名,过滤空值并去重(避免SQL中重复关联同一表的情况)。

测试效果

用你提供的SQL片段测试,脚本会输出:

提取到的JOIN关联表名:
- tableb
- tablec

如果需要保留表名的原始大小写,可以去掉.ToLower(),同时给正则加上不区分大小写匹配的选项:

$joinTableMatches = [regex]::Matches($sqlContent, '(?:inner|left|right|full)\s+join\s+(\w+)|join\s+(\w+)', [System.Text.RegularExpressions.RegexOptions]::IgnoreCase)

内容的提问来源于stack exchange,提问作者Nab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:27:06