场景:我的表中有一个字段(名称:优先级),其中值存储为1,2,3和空格(“”)。
for each mytable no-lock by priority:
此查询按此顺序排序:空白,1,2,3。
for each mytable no-lock by priority desc:
并且,此查询对如下记录进行排序:3,2,1和空白。
但是我需要对这样的记录进行排序:1,2,3然后是空白。按升序但跳过空白并从1开始。 有没有办法对此进行排序?
答案 0 :(得分:2)
由于您使用的是字符字段,因此将数字视为字符串。字符串的ASCII值" 1"," 2"和" 3"是49,50和51.进度将空白("")视为ASCII -1。这就是空白出现的原因。
您最好的选择是使用两个document.getElementById("result1").value = xnumb;
语句。首先进行非空白记录:
FOR EACH
然后做空白记录:
FOR EACH mytable NO-LOCK WHERE mytable.priority <> "" BY priority:
如果您在过程/函数中有业务逻辑,则可以在FOR EACH mytable NO-LOCK WHERE mytable.priority = "":
循环内运行这些逻辑,以防止任何代码重复。
答案 1 :(得分:1)
如果(仅当)表中没有那么多记录,也许您可以将记录复制到具有新优先级的临时表并改为对临时表进行排序?
如果你有数百万的记录,这可能不是它!然后我会考虑简单地添加一个新字段。
DEFINE TEMP-TABLE MyTable NO-UNDO
FIELD priority AS CHARACTER
FIELD txt AS CHARACTER.
CREATE MyTable.
ASSIGN MyTable.priority = "1"
MyTable.txt = "First?".
CREATE MyTable.
ASSIGN MyTable.priority = ""
MyTable.txt = "Last?".
DEFINE TEMP-TABLE ttMyTable NO-UNDO LIKE MyTable
FIELD newPriority AS INTEGER
INDEX sortOrder newPriority.
FOR EACH MyTable NO-LOCK:
CREATE ttMyTable.
BUFFER-COPY MyTable TO ttMyTable
ASSIGN
ttMyTable.newPriority = IF MyTable.priority = "" THEN 99999 ELSE INTEGER(MyTable.priority).
END.
FOR EACH ttMyTable NO-LOCK BY ttMyTable.newPriority:
DISPLAY ttMyTable.
END.
答案 2 :(得分:1)
由于您正在扫描/所有/记录,您可以在BY:
中进行排序