tsql - 分号之间的 PROGRESS DB 提取字符串 - INSTR 函数错误
问题描述
我正在通过 MS SQL Server 中的 OpenQuery 查询进度数据库。
我有一个字段 (addr),其中包含以下格式的字符串值:
text123; text 456; text 789; text 1011
我需要在分号之前提取每个值;对于单独的列
在 T SQL 中,我将使用以下内容提取第一部分:
SELECT
SUBSTRING(addr,1,CHARINDEX(';', addr,1) - 1)
FROM MyTable
但是,在 Progress 中没有 CHARINDEX,而是 INSTR
这是我的开放查询:
SELECT * FROM OPENQUERY (MyServer, 'SELECT addr, SUBSTRING("addr",1,INSTR('';'', "addr",1) - 1) as test FROM MyTable')
但我收到以下错误:
OLE DB provider "MSDASQL" for linked server "MyServer" returned message "[DataDirect][ODBC Progress OpenEdge Wire Protocol driver]Error in row.".
我错过了什么?
解决方案
从 SQL92 来看Progress OpenEdge 中的 Extent/array 字段也显示为用分号分隔,如果这是一个 extent/array 字段,那么您可以简单地使用:
addr[1]
如果不是,那么您可以使用instr
,但您需要使用正确的语法。第一个参数是字符串,第二个是你想在里面找到的。请注意以下额外+ ';'
内容,以确保字符串始终以分号结尾:
substr( addr, 1, instr( addr + ';', ';', 1 ) - 1 )
如果您不仅想要第一个,还想要第二个或第三个,那么它会有点棘手:
select
addr,
substring( addr, 1, instr( addr + ';', ';', 1, 1 ) ) as '#1' ,
case
when instr( addr, ';', 1, 1 ) > 0 then
substring( addr, instr( addr, ';', 1, 1 ), instr( addr + ';', ';', 1, 2 ) - instr( addr, ';', 1, 1 ) )
else
''
end as '#2' ,
case
when instr( addr, ';', 1, 2 ) > 0 then
substring( addr, instr( addr, ';', 1, 2 ), instr( addr + ';', ';', 1, 3 ) - instr( addr, ';', 1, 2 ) )
else
''
end as '#3'
from ...
以上所有内容均已使用 JDBC 驱动程序从 PDSOE (Eclipse) 进行了测试。假设 OPENQUERY 在此过程中没有损坏任何东西,你应该没问题。
推荐阅读
- c# - 使用 c# winforms 将数据更新/保存到 SQL 数据库表
- wordpress - 氧气主题侧边栏标题
- r - 如何在r中生成随机邮政编码
- laravel - 在 Laravel 中具有两个参数的 GroupBy 具有嵌套关系
- c++ - 从孙子调用按钮单击功能
- google-cloud-functions - 为什么在 Vertex AI 示例中 Cloud Function 无法访问元数据服务器?
- javascript - 如何防止在 three.js 中旋转 gltf 模型
- azure - 我们可以在 azure 容器实例中执行的所有 POST Rest API 命令
- ruby-on-rails - Rails - 将表从一个模式复制到同一数据库中的另一个模式
- selenium - Selenium - Powershell 如何打开特定的 Firefox 配置文件