为了账号安全,请及时绑定邮箱和手机立即绑定

动态列的 Progress-ODBC-TSQL CASE 语句正在截断数据

动态列的 Progress-ODBC-TSQL CASE 语句正在截断数据

C#
梦里花落0921 2022-06-12 10:57:23
我正在使用 ODBC 驱动程序通过 Windows C# 应用程序连接到 Progress 数据库。我遇到的问题是我的数据被截断。SELECT     CASE         WHEN (table1_qty_comp = 0) THEN 'Pending'         ELSE             CASE WHEN (table1_qty_comp >= table2_qty_req) THEN 'Completed'                   ELSE 'In-Process'             END       END AS 'Status'FROM     table1 LEFT JOIN table2 ON table1_part = table2_part我的“状态”列中只会出现 8 个字符,因此“处理中”变成“处理中”。我尝试了各种强制转换/转换,例如cast('In-Process' as varchar)cast('In-Process' as varchar(12))cast('In-Process' as nvarchar)cast('In-Process' as nvarchar(12))convert(varchar(12), 'In-Process')convert(nvarchar(12), 'In-Process')str('In-Process')无济于事。如何让完整的“进行中”出现在我的专栏中?这是我从 C# 查询 Progress 数据库的方法DataTable dt = new DataTable();try{    using (OdbcConnection conn = new OdbcConnection(GetConnectionString(db)))    {        OdbcCommand cmd = new OdbcCommand(qry, conn);        conn.Open();        OdbcDataAdapter adpt = new OdbcDataAdapter(cmd);        adpt.Fill(dt);    }                 } catch (OdbcException e) { } return dt;更新我想用什么可能有用的信息来附加我的问题...这是 ODBC 驱动程序:Vendor=DataDirect,Progress SQL92 v9.1E,版本 4.10.01。以下是其他用户在评论中提供的此特定驱动程序的一些资源,此处和此处 此外,我能够通过不使用嵌套CASE语句来解决我的问题,例如:SELECT         CASE             WHEN (table1_qty_comp = 0) THEN 'Pending'                             WHEN (table1_qty_comp >= table2_qty_req) THEN 'Completed'                   ELSE 'In-Process'                       END AS 'Status'    FROM         table1 LEFT JOIN table2 ON table1_part = table2_part
查看完整描述

2 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

澄清这个答案。虽然 OP 问题可以通过多个WHENin来解决CASE,但我的理解是这是伪代码,OP需要子案例。在这种情况下,有一个错误 [我认为] 会截断字符串数据。下面的语法就是为了解决这个问题。我认为,这个问题的价值在于数据切割而不是你可以使用多个WHEN


SELECT 

    CASE 

       WHEN myCol = 0 THEN 'Pending' 

        WHEN myCol = 1 THEN 'Completed' 

        ELSE 'In-Process' 

    END  Status

FROM

  (SELECT 

       CASE 

           WHEN (table1_qty_comp = 0) THEN 0 

           ELSE 

               CASE WHEN (table1_qty_comp >= table2_qty_req) THEN 1       

               ELSE 2 

               END

       END AS myCol

    FROM 

        table1 LEFT JOIN table2 ON table1_part = table2_part) t1


查看完整回答
反对 回复 2022-06-12
?
潇湘沐

TA贡献1816条经验 获得超6个赞

Progress 数据库将所有值存储为可变长度,并且不支持任何宽度属性。

Progress 4GL 非常乐意处理“过度填充”字段。这对于 Progress 应用程序来说是正常的,但它适合 SQL 客户端。

您正在运行 Progress 版本 9(它是古老的、过时的且不受支持的),因此您唯一的选择是在客户端上处理它(如帖子和 TS 的回答中所见)或运行提供的“dbtool”实用程序。dbtool 实用程序将扫描数据库并查找任何被过度填充的字段,然后调整“sql 宽度”,以便 SQL 客户端准确了解实际数据宽度。


查看完整回答
反对 回复 2022-06-12
  • 2 回答
  • 0 关注
  • 161 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号