| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2833 人关注过本帖
标题:如何一次性判断表中某些字段的值(字符型)是空的
只看楼主 加入收藏
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
结帖率:79.38%
收藏
已结贴  问题点数:20 回复次数:22 
如何一次性判断表中某些字段的值(字符型)是空的
一个表中有N个字段(字符型),其中有的字段有值(字符型),有的是没有值(字符型)。如何用程序一次性显示出哪些没有值的字段,并用'0'替换它的值。请行家指教。
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 如何 
2011-06-25 11:14
xmlz
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:294
专家分:1392
注 册:2010-8-29
收藏
得分:7 
可以用循环遍历字段用update更新,判断是多余的,直接把条件写入update就是了。
一次判断所有字段是不现实的。
2011-06-25 15:21
xmlz
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:294
专家分:1392
注 册:2010-8-29
收藏
得分:0 
AFIELDS(af)
FOR i=1 TO ALEN(af,1)
    UPDATE test SET &af(i,1)="0" WHERE EMPTY(&af(i,1))
ENDFOR
2011-06-25 15:26
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 

xmlz:
我试了一下


UPDATE test SET &af(i,1)="0" WHERE EMPTY(&af(i,1))    提示数据类型不对?
&af(i,1)宏代哪里来?
2011-06-25 15:44
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:7 
回复 2楼 xmlz
這個思路循環次數多了,以字段個數的次數反覆遍歴數據庫,很耗時的。

授人以渔,不授人以鱼。
2011-06-25 15:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
遍歴一次的做法:

程序代码:
SCAN ALL
    FOR nIndex = 1 TO FCOUNT()
        cField = FIELD(nIndex)
        IF EMPTY(EVALUATE(cField))
            REPLACE (cField) WITH "0"
        ENDIF
    NEXT
ENDSCAN


用EMPTY()函數的时候,除字符型變量爲空(空串或空格串)外,還包括數値零、邏輯假的情況,如果你的數據表包含非字符型字段,在REPLACE時應分支按字段類型執行。

[ 本帖最后由 TonyDeng 于 2011-6-25 16:01 编辑 ]

授人以渔,不授人以鱼。
2011-06-25 15:55
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
TonyDeng:
谢谢你的指教。
2011-06-25 16:54
xmlz
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:294
专家分:1392
注 册:2010-8-29
收藏
得分:0 
以下是引用TonyDeng在2011-6-25 15:55:47的发言:

遍歴一次的做法:
 
 
SCAN ALL
    FOR nIndex = 1 TO FCOUNT()
        cField = FIELD(nIndex)
        IF EMPTY(EVALUATE(cField))
            REPLACE (cField) WITH "0"
        ENDIF
    NEXT
ENDSCAN
 
 
用EMPTY()函數的时候,除字符型變量爲空(空串或空格串)外,還包括數値零、邏輯假的情況,如果你的數據表包含非字符型字段,在REPLACE時應分支按字段類型執行。
你自己分析一下那个循环次数更多呢?
假定250个字段,1000条记录,字段数够多,记录数够少吧,
遍历字段只需250次;
scan需要1000次,加里面的for循环,共计1000*250=250000次。你既遍历了字段有循环了记录,使操作次数呈记录级倍增。
实际应用字段很难会有250个,记录却往往会超过1000条。

[ 本帖最后由 xmlz 于 2011-6-26 09:35 编辑 ]
2011-06-26 09:19
xmlz
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:294
专家分:1392
注 册:2010-8-29
收藏
得分:0 
以下是引用sylknb在2011-6-25 15:44:50的发言:


xmlz:
我试了一下:

UPDATE test SET &af(i,1)="0" WHERE EMPTY(&af(i,1))    提示数据类型不对?
&af(i,1)宏代哪里来?

afields(af)将字段信息存入了数组af,VFP9.0测试通过。
如果你的版本不支持这样,可以引一个中间变量进来
AFIELDS(af)
FOR i=1 TO ALEN(af,1)
    vtmp=af(i,1)
    UPDATE test SET &vtmp.="0" WHERE EMPTY(&vtmp.)
ENDFOR
2011-06-26 09:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 8楼 xmlz
你不知道每一條UPDATE指令是對整個表進行操作的?SQL指令在磁盤中生成多少個臨時文件、需要多少IO開銷?數據表記錄少的時候,兩者的差別不明顯,但在達到上萬條記錄的時候,就有明顯差異了。

授人以渔,不授人以鱼。
2011-06-26 09:33
快速回复:如何一次性判断表中某些字段的值(字符型)是空的
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026078 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved