Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 生成的SQL中错误位置附近的语法不正确_Java_Sql Server - Fatal编程技术网

Java 生成的SQL中错误位置附近的语法不正确

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

我正在生成下面的SQL。在我的代码中,我使用where条件列表收集所有where逻辑,并在连接逻辑设置后插入它。然而,我得到了一个非常普遍的语法错误,我不知道为什么。但是,我很确定逻辑组织得很好,当插入where语句时,它会抛出语法错误

WHERE附近的语法不正确

{h-schema}只是生成的数据库和表名

守则:

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评论,这是生成和替换的,不是问题。这实际上是一个评论。但不要把编译没有错误和工作正常等同起来。还有其他问题会阻止查询返回正确的结果。