如何在cfml/coldfusion中模拟sql语句逻辑?

pkln4tw6  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(447)

我遇到了一个问题,我试图将我的sql语句转换为cfml中的相同逻辑(cfscript>),因此,我试图模拟这个sql语句来显示cfscript中的结果。有人能帮我解决这个问题吗?谢谢你的帮助。
sql语句:

select * from myapp.GGG_myphone where department_name 
        like (select distinct department_name from myapp.GGG_myphone
         where department_nbr like '#DEPT_FUND_NBR#'  )
nwlls2ji

nwlls2ji1#

@斯科特,我假设:
select查询中的每一行都表示一个类似于所示的json。毕竟,列名与json中的键匹配。
您已经或打算存储许多这样的json,每个json都作为一个文件。我从你的文件读取代码推断出这一点。假设这些文件存储在一个名为“jsons”的目录中。
您需要的是coldfusion代码,它将选择与select查询中的条件匹配的json文件。

<cfscript>
array function getJSONByDeptName(string departmentNbr)  {
var JsonFiles = arrayNew(1); 
var JsonFile = "";
var JsonData = {};
var collectionOfMatchingJsonData = arrayNew(1); 
var departmentNamesList = "";

/* Here, we assume the JSON files are stored in subdirectory 'jsons' within current directory*/
JsonFiles = directorylist(expandPath('jsons'));

if (arrayLen(JsonFiles) gt 0) {
    for (var fileNumber=1; fileNumber lte arrayLen(JsonFiles); fileNumber=fileNumber+1) {
        /* Get each file in turn*/
        JsonFile = fileRead(JsonFiles[fileNumber]);

        /*Read its JSON content. The result is an array containing one item of type struct*/
        jsonData = deserializeJSON(JsonFile);

        /* Reminder: jsonData[1] is a struct. Check whether the departmentNbr key in the struct 
           matches the input value of departmentNbr. 
           If it does, add the jsonData to the list, avoiding duplicate values of departmentName */     
        if (jsonData[1].departmentNbr eq arguments.departmentNbr and ListFindNoCase(departmentNamesList, jsonData[1].departmentName) eq 0) {
            arrayAppend(collectionOfMatchingJsonData,jsonData)

            /* Add department name to list.  */
            departmentNamesList = listAppend(departmentNamesList, jsonData[1].departmentName);

        }

    }

}

return collectionOfMatchingJsonData;    
}

 // Test it, using departmentNbr '1982' 
 writedump(getJSONByDeptName('1982'));
 </cfscript>
bprjcwpo

bprjcwpo2#

这是一个评论,而不是一个答案,但这里去。你想这么做吗

<cfscript>
jsonData = [...];

filteredJsonData = jsonData.filter(function(row) {
    return row.department_nbr == variables.DEPT_FUND_NBR; 
})
</cfscript>

arrayfilter()函数的作用是返回一个新数组,它是原始数组的子集。内部函数必须返回true或false。如果是真的,它将成为新数组的一部分。我使用成员函数方法是因为我不喜欢打字。
更多信息。在arrayfilter()上,请参见https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-a-b/arrayfilter.html
注意:我们必须把 dept_fund_nbr 进入内部函数可见的范围。很可能您的代码有一个更好的范围。

相关问题