IBM大型机论坛索引
 
登录
 
IBM大型机论坛索引 大型机:搜索 IBM Mainframe论坛:常见问题解答 寄存器
 

2 Cobol db2 pgm中查询中的where子句?


IBM大型机论坛 -> DB2
发表新话题   回复主题
查看上一个主题 :: 查看下一个主题  
作者 信息
gch77

新的用户


已加入:2009年3月16日
帖子:13
地点:钦奈

发布发表于:星期五七月18,2014 10:26上午
引用回复

大家好

基于cobol db2程序中的WS变量,查询中是否可能有多个where子句。

目前,我使用这种方式,但是我想知道它是否可以写得更好。

码:
如果WS-A ='类型1'             
   EXEC SQL                                   
     SELECT FIELD1                               
      进入:WS-FIELD1         
       FROM TABLENAME                   
      WHERE FIELD2 IN('X','Y')   AND
                  FIELD3 =:WS-FIELD3                   
   END-EXEC                                   
其他 IF WS-A ='类型2'             
   EXEC SQL                                   
     SELECT FIELD1                               
      进入:WS-FIELD1         
       FROM TABLENAME                   
      WHERE FIELD2 = 'Z'   AND
                  FIELD3 =:WS-FIELD3                   
   END-EXEC   
万一
回到顶部
查看用户资料 发送私信
chandan.inst

活跃用户


加入:2005年11月3日
帖子:275
地点:孟买

发布发表于:星期五七月18,2014 12:07下午
引用回复

你好

您能以哪种方式更好地说明它?

很明显,我看不到任何逻辑编写方式的问题

我可以想到的是使用IFLUATE而不是嵌套的IF。

问候,
昌丹
回到顶部
查看用户资料 发送私信
比尔·伍德格

主持人荣誉


加入时间:2011年3月9日
帖子:7311
位置:矩阵内部

发布发表:星期五七月18,2014 12:12下午
引用回复

是的,我也不确定您要实现什么。您想让它变得更难以理解:那是出于什么原因呢?少打字?

我会在WS-A上将这些字面量设为88(我希望不是真正的WS-A),并使用EVALUATE TRUE。一切都带有漂亮的描述性名称。简单的SQL。试试吧。把它给同事,看看他们喜欢哪种方式。交给分析师。
回到顶部
查看用户资料 发送私信
gch77

新的用户


已加入:2009年3月16日
帖子:13
地点:钦奈

发布发表:2014年7月18日,星期五2:16 pm
引用回复

对困惑感到抱歉。我的问题是,正确的代码就是这样,并且可以正常工作。我想进一步优化它。

码:
如果WS-A ='类型1'             
   EXEC SQL                                   
     SELECT FIELD1                               
      进入:WS-FIELD1         
       FROM TABLENAME                   
      WHERE FIELD2 IN('X','Y')   AND
                  FIELD3 =:WS-FIELD3                   
   END-EXEC                                   
其他 IF WS-A ='类型2'             
   EXEC SQL                                   
     SELECT FIELD1                               
      进入:WS-FIELD1         
       FROM TABLENAME                   
      WHERE FIELD2 = 'Z'   AND
                  FIELD3 =:WS-FIELD3                   
   END-EXEC   
万一
万一


我想避免重复两次SQL查询。因为查询是相同的,除了以下更改。
如果WS-A为“类型1”,则要查找的FIELD2的值为in('X','Y')。
如果WS-A为“类型2”,则要查找的FIELD2的值为“ Z”。

我尝试使用88变量
码:
01 WS-FIELD2  PIC(X) VALUE SPACES.
    88 WS-XY    PIC(X)  VALUE 'X','Y'.
    88 WS-Z      PIC(X) VALUE 'Z'.


和代码为:

码:
如果WS-A ='类型1'   
    SET  WS-XY TO TRUE
其他 IF WS-A ='类型2'
    SET WS-Z TO TRUE
万一
万一 


并查询为:
码:
执行SQL                                   
     SELECT FIELD1                               
      进入:WS-FIELD1         
       FROM TABLENAME                   
      WHERE FIELD2 = :WS-FIELD2   AND
                  FIELD3 =:WS-FIELD3                   
结束执行


但是它不能正常工作。始终将Field2仅查找为“ X”。

希望解释清楚,请告知。
回到顶部
查看用户资料 发送私信
gch77

新的用户


已加入:2009年3月16日
帖子:13
地点:钦奈

发布发表于:星期五七月18,2014 4:00下午
引用回复

以上任何帮助。 icon_sad.gif icon_sad.gif
回到顶部
查看用户资料 发送私信
比尔·伍德格

主持人荣誉


加入时间:2011年3月9日
帖子:7311
位置:矩阵内部

发布发表:2014年7月18日,星期五5:08 pm
引用回复

为什么要“进一步优化”?在什么方面进行优化?

您应该阅读SET并仔细考虑一个字节字段可以同时包含两个值(X和Y)的方式。在将SET设置为TRUE之后,它只会包含X。这不是最优化,这正在破坏一个正在运行的程序-为什么?
回到顶部
查看用户资料 发送私信
唐·雷西

活跃的成员


已加入:2010年7月6日
帖子:696
地点:加拿大安大略省惠特比

发布发表:2014年7月18日,星期五,下午6:10
引用回复

我认为TS希望有1条SQL语句,其中整个WHERE子句由一个变量定义。

可以做到,但是这需要您进入动态SQL的主题,这将需要更多的编码。
回到顶部
查看用户资料 发送私信
比尔·伍德格

主持人荣誉


加入时间:2011年3月9日
帖子:7311
位置:矩阵内部

发布发表:2014年7月18日,星期五,下午6:38
引用回复

是的,唐,我认为您是对的。但是,这有什么优化呢?
回到顶部
查看用户资料 发送私信
特里·海因兹

JCL主持人


已加入:2008年7月14日
帖子:1249
地点:美国明尼苏达州里奇菲尔德

发布发表:2014年7月18日,星期五,下午6:46
引用回复

不要将“优化”视为“可维护性”。您的继任者将不胜感激。
回到顶部
查看用户资料 发送私信
chandan.inst

活跃用户


加入:2005年11月3日
帖子:275
地点:孟买

发布发表:2014年7月18日,星期五6:47 pm
引用回复

你好

我也不确定进一步优化的含义。

在给定的时间,仅将执行一个Sql查询,因此使用额外的代码不会导致任何性能问题

如果TS希望在一个查询中实现以上目标,我可以看到一种方式,但我不希望以这种方式实现。这是未经测试的

码:
执行SQL                                   
     SELECT FIELD1                               
      进入:WS-FIELD1         
       FROM TABLENAME                   
      WHERE FIELD2 IN(:WS-X,:WS-Y,:WS-Z)   AND
                  FIELD3 =:WS-FIELD3                   
   END-EXEC     


码:
如果WS-A ='类型1'
   用填充WS-X和WS-Y X和Y分别。
   如果表中不存在高值,则用X或高值填充WS-Z
其他
  IF WS-A = 'Type 2'
     用高值或Z填充WS-X,WS-Y
     用值Z填充WS-Z


问候,
昌丹
回到顶部
查看用户资料 发送私信
罗希特·乌马尔吉卡(Rohit Umarjikar)

全球主持人


已加入:2010年9月21日
帖子:2581
地点:美国纽约

发布发表:2014年7月18日,星期五,下午6:48
引用回复

Don建议使用动态SQL,这也是满足要求的完美选择,正如您向我们展示的那样,它已经被简化了,但是如果您想将它重写为一个,可能会低于1,但您需要根据需要进行测试

码:
   EXEC SQL                                   
     SELECT FIELD1 
           ,FIELD2                             
      进入:WS-FIELD1
          ,:WS-FIELD2         
       FROM TABLENAME                   
      WHERE FIELD2 IN('X','Y', 'Z')   AND
            FIELD3 =:WS-FIELD3     

             
如果WS-FIELD2 ="Z"
   Process "Type 1" records
其他
  处理"Type 2" Records
万一
回到顶部
查看用户资料 发送私信
盖伊

高级会员


已加入:2009年8月11日
帖子:1281
地点:比利时

发布发表:2014年7月24日,星期四,12:57 pm
引用回复

chandan.inst所说的,但使用组字段作为标准。

码:
01 ws标准。
  03 ws-crit1 pic X.
  03 ws-crit2 pic X.

如果WS-A ='类型1'
     MOVE 'X' to ws-crit1
     MOVE 'Y' to ws-crit2
其他
     MOVE 'Z' to ws-crit1
     MOVE 'Z' to ws-crit2
万一

执行SQL                                   
      选择字段1                               
       INTO :WS-FIELD1         
        来自TABLENAME                   
       WHERE FIELD2 IN :WS-CRIT 和
                   FIELD3 = :WS-FIELD3                   
    结束执行     
回到顶部
查看用户资料 发送私信
马索

REXX主持人


已加入:2006年3月13日
帖子:1348
地点:以色列

发布发表于:2014年7月24日,星期四,下午2:53
引用回复

编译器接受了该语句,但是我不确定它是否确实有效(我没有执行它)。
不确定是否可以将其称为“优化”
码:
   EXEC SQL                                   
     SELECT FIELD1                               
     INTO :WS-FIELD1         
     FROM TABLENAME                   
     WHERE FIELD3 =:WS-FIELD3 和
       (   (:WS-A ='类型1'和FIELD2 IN('X','Y'))
        OR (:WS-A = 'Type 2' 和 FIELD2 = 'Z'       ) )
   END-EXEC
回到顶部
查看用户资料 发送私信
查看上一个主题 :: :: 查看下一个主题  
发表新话题   回复主题 查看书签
所有时间均为格林尼治标准时间+ 6小时
论坛索引 -> DB2

 


类似主题
话题 论坛 回覆
没有新帖 帮助编写SQL查询 DB2 1
没有新帖 在合并查询中需要帮助 DB2 4
没有新帖 检查内部总计数... JCL和VSAM 5
该主题已锁定:您无法编辑帖子或回复。 将字段名称传递给COBOL程序 COBOL程式设计 10
没有新帖 COBOL性能调整 COBOL程式设计 6
搜索我们的论坛:


回到顶部