查看this和此代码:
data Work.SomeDataset;
set Work.SomeDataset;
SomeColumn = compress(SomeColumn, byte(34));
SomeColumn = compress(SomeColumn, byte(38));
run;
我是否认为这会从SomeColumn中删除字符"
(byte(34))和&
(byte(38))?如果是这样,是否有更有效的方法来实现这一目标?
答案 0 :(得分:3)
这已经非常接近最优,但是我建议稍微改进一下:
SELECT DISTINCT BizTalk_POA_HEADER.PONUMBER, FAN_Suppliers.SupplierName,
FAN_Company_Details.CompanyName, FAN_Company_Details.[PrimaryEmail],
BizTalk_POA_HEADER.[DeliveryDate]
FROM BizTalk_POA_HEADER INNER JOIN
FAN_PO_Details ON BizTalk_POA_HEADER.PONUMBER =
CONCAT('PO',FAN_PO_Details.PoNumber) INNER JOIN
FAN_PO ON FAN_PO_Details.PurchaseOrderID = FAN_PO.PurchaseOrderID
INNER JOIN FAN_SupplierDetails ON FAN_PO.SupplierDetailsID =
FAN_SupplierDetails.SuppliersDetailsID INNER JOIN
FAN_Suppliers ON FAN_SupplierDetails.SupplierID = FAN_Suppliers.SupplierID
INNER JOIN FAN_Company_Details ON FAN_PO.CompanyID =
FAN_Company_Details.CompanyDetailsID
WHERE (BizTalk_POA_HEADER.PONUMBER = @POID)
这样可以更清楚地删除哪些字符并在同一个传递中删除它们。
答案 1 :(得分:1)
是的,删除那些ascii字符。您可以通过连接在一个COMPRESS调用中执行此操作,当然您可以将'&"'
传递给函数,但我认为您有理由不这样做。
如果这是一个问题,您可能还想使用COMPBL来删除此进程可能创建的额外空格。
data Work.want;
set Work.have;
someColumn = compress(someColumn,byte(34)||byte(38));
put SomeColumn=;
run;
你也可以使用UPDATE(SQL)或MODIFY(数据步骤)来避免重写数据集......
proc sql;
update have
set someColumn = compress(someColumn,byte(34)||byte(38));
quit;
也许更有效率,也许不是;如果您不能使用WHERE语句来过滤掉不需要更新的案例,那么最终可能没有什么不同,但是如果可以的话(例如,如果很少这样做),它可能会更有效率。
编辑: 修改看起来不是答案。在1e7行的快速测试中,MODIFY实时严格较慢并且具有更多的CPU时间。
SQL UPDATE也很慢,所以我不会使用其中任何一个,除非你有一个非常罕见的更新场景(但在你的情况下测试)。
答案 2 :(得分:1)
您可以将这些字符放入一个电话中。
data have;
format a $12.;
a = "A" || byte(34) || "B";
output;
a = "A" || byte(34) || "B" || byte(36) || "C";
output;
run;
data want;
set have;
b = compress(a,byte(34)||byte(36));
run;