【问题标题】:Prevent loss of preceeding zeroes in [MEMNO] value when querying?查询时防止 [MEMNO] 值中的前零丢失?
【发布时间】:2014-01-10 13:49:38
【问题描述】:

我有几个在应用程序中使用的 SQL 语句。我注意到当某些会员号返回时,例如012345,它们返回为12345。此数字用于协助文件命名约定,并且根据某些其他标准,需要采用 6 位格式才能正确处理文件。

谁能帮我解决这个问题?截断来自查询 IBM AS400 系统。有人建议使用 DIGITS( ) 函数,但我还没有让它与下面的示例查询一起使用:

SELECT DISTINCT DIGITS(a.memno), 
a.name, 
a.addr1, 
a.addr2, 
a.city, 
a.state, 
a.zip, 
a.sex, 
a.lname, 
a.ssan, 
b.addr1 as old_addr1, 
b.addr2 as old_addr2, 
b.city as old_city, 
b.state as old_state, 
b.zip as old_zip, 
'P' as SYS 
FROM Lib1.Table1 a, Lib1.Table2 b 
WHERE a.memno = b.memno and 
      b.groupid = 'P2' and  
      b.type = 'B' and  
      b.rcchg <> 'N' and  
      b.datec = 20140107  
      AND (UPPER(a.addr1) <> UPPER(b.addr1) or UPPER(a.addr2) <> UPPER(b.addr2) or UPPER(a.city) <> UPPER(b.city) or UPPER(a.state) <> UPPER(b.state) or UPPER(a.zip) <> UPPER(b.zip)) 
UNION SELECT DISTINCT 
DIGITS(a.memno), 
a.name, 
a.addr1, 
a.addr2, 
a.city, 
a.state, 
a.zip, 
a.sex, 
a.lname, 
a.ssan, 
b.addr1 as old_addr1, 
b.addr2 as old_addr2, 
b.city as old_city, 
b.state as old_state, 
b.zip as old_zip, 
'N' as SYS 
FROM Lib2.Table1 a, Lib2.Table2 b 
WHERE a.memno = b.memno and  
      b.groupid = 'N2' and  
      b.type = 'B' and  
      b.rcchg <> 'N' and  
      b.datec = 20140107 AND (UPPER(a.addr1) <> UPPER(b.addr1) or UPPER(a.addr2) <> UPPER(b.addr2) or UPPER(a.city) <> UPPER(b.city) or UPPER(a.state) <> UPPER(b.state) or UPPER(a.zip) <> UPPER(b.zip)) 
ORDER BY sys, memno asc

当我在 AS400 上运行此查询时,它的工作方式完全符合预期。但是,当我在 Visual Studio 2012 的服务器资源管理器中通过数据连接运行它时,我收到:

Error Source: CWBODBC.DLL
Error Message: ERROR [Hy000] [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0208 - ORDER BY column MEMNO or expression not in result table.

此查询是通过我的 C# 应用程序使用 ODBC 连接上的 ODBC 命令发送的。

【问题讨论】:

    标签: c# sql odbc database-connection ibm-midrange


    【解决方案1】:

    试试列号:

    ORDER BY 16, 1 asc
    

    编辑:添加支持背景信息。

    第一列未命名,因为它是函数的结果。

    最终表的第一列未命名,因为第一个 SELECT 中的 column1 未命名。 由于该列未命名,因此不能将其包含在 ORDER BY 中。

    所以除了 ORDER BY 1 asc 之外,您还可以将第一个 SELECT 更改为类似

    SELECT DISTINCT DIGITS(a.memno) as memno, ... ORDER BY sys, memno

    通过在第一个 SELECT 中给列一个名称,结果表列就有了一个名称。

    IBM DB2 for i SQL reference 7.1 ORDER BY

    【讨论】:

    • 查看我的编辑。不确定您是如何在 IBM i 端运行 SQL,或者您正在运行什么版本的 DB2 for I,或者您正在使用什么版本的 ODBC 驱动程序。显然它们之间是有区别的。
    • 好的,谢谢巴克!这行得通,但我也注意到服务器资源管理器一直试图将我的DIGITS(a.memno) 重命名为 Expr1,因此通过将其设置为DIGITS(a.memno) as memno,即使使用ORDER BY sys, memno asc,一切都可以正常运行。再次感谢您的帮助!
    猜你喜欢
    • 2018-06-22
    • 2021-03-31
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    相关资源
    最近更新 更多