查看上一个主题 :: 查看下一个主题
|
作者 |
信息 |
gch77
新的用户
已加入:2009年3月16日 帖子:13 地点:钦奈
|
|
|
|
大家好
基于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 地点:孟买
|
|
|
|
你好
您能以哪种方式更好地说明它?
很明显,我看不到任何逻辑编写方式的问题
我可以想到的是使用IFLUATE而不是嵌套的IF。
问候,
昌丹 |
|
回到顶部 |
|
 |
比尔·伍德格
主持人荣誉
加入时间:2011年3月9日 帖子:7311 位置:矩阵内部
|
|
|
|
是的,我也不确定您要实现什么。您想让它变得更难以理解:那是出于什么原因呢?少打字?
我会在WS-A上将这些字面量设为88(我希望不是真正的WS-A),并使用EVALUATE TRUE。一切都带有漂亮的描述性名称。简单的SQL。试试吧。把它给同事,看看他们喜欢哪种方式。交给分析师。 |
|
回到顶部 |
|
 |
gch77
新的用户
已加入:2009年3月16日 帖子:13 地点:钦奈
|
|
|
|
对困惑感到抱歉。我的问题是,正确的代码就是这样,并且可以正常工作。我想进一步优化它。
码: |
如果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 地点:钦奈
|
|
回到顶部 |
|
 |
比尔·伍德格
主持人荣誉
加入时间:2011年3月9日 帖子:7311 位置:矩阵内部
|
|
|
|
为什么要“进一步优化”?在什么方面进行优化?
您应该阅读SET并仔细考虑一个字节字段可以同时包含两个值(X和Y)的方式。在将SET设置为TRUE之后,它只会包含X。这不是最优化,这正在破坏一个正在运行的程序-为什么? |
|
回到顶部 |
|
 |
唐·雷西
活跃的成员
已加入:2010年7月6日 帖子:696 地点:加拿大安大略省惠特比
|
|
|
|
我认为TS希望有1条SQL语句,其中整个WHERE子句由一个变量定义。
可以做到,但是这需要您进入动态SQL的主题,这将需要更多的编码。 |
|
回到顶部 |
|
 |
比尔·伍德格
主持人荣誉
加入时间:2011年3月9日 帖子:7311 位置:矩阵内部
|
|
|
|
是的,唐,我认为您是对的。但是,这有什么优化呢? |
|
回到顶部 |
|
 |
特里·海因兹
JCL主持人
已加入:2008年7月14日 帖子:1249 地点:美国明尼苏达州里奇菲尔德
|
|
|
|
不要将“优化”视为“可维护性”。您的继任者将不胜感激。 |
|
回到顶部 |
|
 |
chandan.inst
活跃用户

加入:2005年11月3日 帖子:275 地点:孟买
|
|
|
|
你好
我也不确定进一步优化的含义。
在给定的时间,仅将执行一个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 地点:美国纽约
|
|
|
|
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 地点:比利时
|
|
|
|
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 地点:以色列
|
|
|
|
编译器接受了该语句,但是我不确定它是否确实有效(我没有执行它)。
不确定是否可以将其称为“优化”
码: |
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 |
|
|
回到顶部 |
|
 |
|