【问题标题】:Coldfusion Query OF Query Generates more records than expectedColdfusion Query OF Query 生成的记录多于预期
【发布时间】:2021-05-05 08:47:12
【问题描述】:

这个真的把我难住了

我有 3 个查询

查询 1:

使用一系列 where 语句完成查询

查询 2 是查询 1(减去所有 where 语句),因为我决定创建一个或多个查询

查询 3 是查询的查询,它在 from 语句中引用查询 2,然后使用 where 语句过滤从查询 2 收到的结果

我希望查询 1 和 3 的结果是相同的,但查询的查询输出的记录比查询 1 多出近 1500 条记录

任何建议建议为什么请赐教

<CFQUERY datasource="#Application.Workflow#" name="query1">
SELECT 
                * 
FROM
                Campaigns
INNER JOIN         
                CampaignReceipients
ON
                Campaigns.CampaignId=CampaignReceipients.CampaignId
WHERE
                Campaigns.CampaignId  = 191
AND
                ClientMobilePhone <> ''
AND
                ClientEmailAddress like '%@%'
AND
                ClientBusinessPhone is null 
AND
                ClientHomePhone is null 
AND 
                AssignedToDate is null
</CFQUERY>      
                
<CFQUERY datasource="#Application.Workflow#" name="query2">
SELECT 
                * 
FROM
                Campaigns
INNER JOIN         
                CampaignReceipients
ON
                Campaigns.CampaignId=CampaignReceipients.CampaignId
WHERE
                Campaigns.CampaignId  = 191
</CFQUERY>
                
<cfquery dbtype="query" name="query3">
SELECT 
                *
FROM
                query2
WHERE 
                ClientMobilePhone <> ''
AND
                ClientEmailAddress like '%@%'
AND
                ClientBusinessPhone is null 
AND
                ClientHomePhone is null 
AND 
                AssignedToDate is null
</cfquery>         

【问题讨论】:

    标签: coldfusion coldfusion-9


    【解决方案1】:

    在没有看到您的数据或您的数据库服务器类型的情况下,我仍然相信这是由于查询的 CF 查询如何处理字符串比较中的 NULL 值。

    使用您的原始数据源级别查询,比较 WHERE ClientMobilePhone &lt;&gt; '' 将忽略所有记录 WHERE ClientMobilePhone IS NULL

    而对于 CF QoQ,WHERE ClientMobilePhone &lt;&gt; '' 将返回 ClientMobilePhone 为 NULL 或非空字符串的记录。

    这里不支持SQLISNULL()/IFNULL(),但是可以单独测试NULL;您可以通过在问题中的代码中添加第四个查询来确认这是否确实发生了:

    <cfquery dbtype="query" name="query4">
    SELECT 
                    *
    FROM
                    query2
    WHERE 
                    ClientMobilePhone <> '' AND ClientMobilePhone IS NOT NULL
    AND
                    ClientEmailAddress like '%@%'
    AND
                    ClientBusinessPhone is null 
    AND
                    ClientHomePhone is null 
    AND 
                    AssignedToDate is null
    </cfquery> 
    

    【讨论】:

    • 好的,所以我已经尝试了您的代码,是的,数字从比预期多 1500 减少到仅比预期多 200,因此 ms sql db 中的每个字段都是 nvarchar 类型的(50)
    • 那么在测试 null 和 null 时我可以使用一种标准方法,因此它对于正常查询和 q 的 q 都可以正常工作
    • 很难在没有看到数据的情况下解释最后 200 个。这些查询是您正在使用的确切 SQL,还是为了在此处发布而简化或匿名?对于“标准方法”,ClientMobilePhone &lt;&gt;'' AND ClientMobilePhone IS NOT NULL 语法适用于 MS SQL 和 CFQoQ SQL。其他需要注意的概念包括 MS SQL 中的ISNULL(ClientMobilePhone,'')&lt;&gt;'',以及cfqueryparam 标记的null="true" 可选属性。但是 imo 的“标准方法”很少有意义,因为 QoQ 语法是 SQL 的一个非常有限的子集,所以我们在使用它时必须牢记这一点。
    • 我的猜测是,如果您将空字符串逻辑应用于 ClientBusinessPhone 和 ClientHomePhone 字段,那么 200 条额外的记录将会消失。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    相关资源
    最近更新 更多