Java 生成的SQL中错误位置附近的语法不正确
我正在生成下面的SQL。在我的代码中,我使用where条件列表收集所有where逻辑,并在连接逻辑设置后插入它。然而,我得到了一个非常普遍的语法错误,我不知道为什么。但是,我很确定逻辑组织得很好,当插入where语句时,它会抛出语法错误 WHERE附近的语法不正确 {h-schema}只是生成的数据库和表名 守则:Java 生成的SQL中错误位置附近的语法不正确,java,sql-server,Java,Sql Server,我正在生成下面的SQL。在我的代码中,我使用where条件列表收集所有where逻辑,并在连接逻辑设置后插入它。然而,我得到了一个非常普遍的语法错误,我不知道为什么。但是,我很确定逻辑组织得很好,当插入where语句时,它会抛出语法错误 WHERE附近的语法不正确 {h-schema}只是生成的数据库和表名 守则: SELECT count(*) AS ID FROM ( SELECT 'PREAPPROVAL' AS type, pa.id AS id FROM {h-schema}preap
SELECT count(*) AS ID
FROM (
SELECT 'PREAPPROVAL' AS type, pa.id AS id FROM {h-schema}preapproval AS pa
LEFT JOIN {h-schema}risk_limit AS lim ON pa.limit_id = lim.id
LEFT JOIN {h-schema}desk AS d ON lim.desk_enterprise_id = d.enterprise_id AND CAST(pa.creation_date_time AS date) BETWEEN d.start_date AND d.end_date
WHERE pa.status = 'APPROVED' AND pd.end_date = NULL <-------------------------SYNTAX ERR HERE
OR pa.status = 'DECLINED' AND pa.completion_date_time > '2021-01-28 13:02:13'
OR pa.status = 'IN_PROGRESS'
OR pa.creation_date_time > '2021-01-28 13:02:13'
AND COALESCE(lim.policy_enterprise_id, d.policy_enterprise_id) IN (6)
UNION
SELECT 'BREACH' AS type, br.id AS id FROM {h-schema}breach AS br
LEFT JOIN {h-schema}risk_limit AS lim ON br.limit_id = lim.id
LEFT JOIN {h-schema}desk AS d ON lim.desk_enterprise_id = d.enterprise_id
AND br.reporting_date BETWEEN d.start_date AND d.end_date
LEFT JOIN {h-schema}valid_breach_recommendation AS vbr_approve ON vbr_approve.id = (SELECT TOP(1) id FROM {h-schema}valid_breach_recommendation
WHERE breach_id = br.id AND outcome = 'APPROVE'
ORDER BY creation_date_time DESC, id DESC)
LEFT JOIN {h-schema}valid_breach_decision AS vbd
ON vbd.id = (SELECT TOP(1) id FROM {h-schema}valid_breach_decision
WHERE breach_id = br.id
ORDER BY creation_date_time DESC, id DESC)
LEFT JOIN {h-schema}breach AS child_br ON br.id = child_br.parent_breach_id
WHERE br.status = 'APPROVED' AND vbd.end_date = NULL <--------------------SYNTAX ERR HERE
OR br.status = 'DECLINED' AND br.completion_date_time > '2021-01-28 13:02:14'
OR br.status = 'IN_PROGRESS'
OR br.creation_date_time > '2021-01-28 13:02:14'
AND child_br.id IS NULL
AND CASE br.status
WHEN 'IN_PROGRESS' THEN vbr_approve.start_date
WHEN 'APPROVED' THEN vbd.start_date
WHEN 'CANCELLED' THEN vbd.start_date
ELSE NULL
END IS NOT NULL AND COALESCE(lim.policy_enterprise_id, d.policy_enterprise_id) IN (6)
) AS issue
由于{h-schema},删除{h-schema}而导致一些语法错误,并且您的代码没有语法错误。删除{h-schema}您的代码就可以正常工作。有s=NULL而不是IS-NULL。您是否尝试过IS-NULL而不是IS-NULL?后者永远无效。MySQL或SQL Server?请仅标记单个RDBMS。。。而且您没有表别名pd,因此pd.end_date无效。所以应该是pd.end_date为空我认为这是Microsoft SQL Server错误,而不是MySQL错误。MySQL中的语法错误消息包括查询的一个摘录,它位于查询混乱的地方。在没有括号的where子句中同时使用AND和OR通常是一个逻辑问题。当心根据OPs评论,这是生成和替换的,不是问题。这实际上是一个评论。但不要把编译没有错误和工作正常等同起来。还有其他问题会阻止查询返回正确的结果。