Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.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
Sql 火鸟-如何使用;(?为空)";用于选择空白参数_Sql_Excel_Parameters_Null_Firebird - Fatal编程技术网

Sql 火鸟-如何使用;(?为空)";用于选择空白参数

Sql 火鸟-如何使用;(?为空)";用于选择空白参数,sql,excel,parameters,null,firebird,Sql,Excel,Parameters,Null,Firebird,我正在处理一个链接到Firebird 2.0 DB的Excel报告,我有各种参数链接到对应于下拉列表的单元格引用 如果某个参数留空,我希望选择所有可能的选项。我正试图通过把。。。哪里(?为null),如中所述,但我收到一个“无效数据类型”错误 我找到了一些Firebird文档(),其中谈到了这个错误,但它指出“解决方案是将值转换为适当的数据类型,以便所有查询都为每个列返回相同的数据类型。”我不太确定这在我的情况下意味着什么 SELECT C.COSTS_ID, C.AREA_ID,

我正在处理一个链接到Firebird 2.0 DB的Excel报告,我有各种参数链接到对应于下拉列表的单元格引用

如果某个参数留空,我希望选择所有可能的选项。我正试图通过把。。。哪里(?为null),如中所述,但我收到一个“无效数据类型”错误

我找到了一些Firebird文档(),其中谈到了这个错误,但它指出“解决方案是将值转换为适当的数据类型,以便所有查询都为每个列返回相同的数据类型。”我不太确定这在我的情况下意味着什么

SELECT C.COSTS_ID,
       C.AREA_ID,
       S.SUB_NUMBER,
       S.SUB_NAME,
       TP.PHASE_CODE,
       TP.PHASE_DESC,
       TI.ITEM_NUMBER,
       TI.ITEM_DESC,
       TI.ORDER_UNIT,
       C.UNIT_COST,
       TI.TLPE_ITEMS_ID
FROM TLPE_ITEMS TI
  INNER JOIN TLPE_PHASES TP ON TI.TLPE_PHASES_ID = TP.TLPE_PHASES_ID
  LEFT OUTER JOIN COSTS C ON C.TLPE_ITEMS_ID = TI.TLPE_ITEMS_ID
  LEFT OUTER JOIN AREA A ON C.AREA_ID = A.AREA_ID
  LEFT OUTER JOIN SUPPLIER S ON C.SUB_NUMBER = S.SUB_NUMBER
WHERE ((C.AREA_ID = 1 OR C.AREA_ID = ?) OR **(? IS NULL))**
  AND ((S.SUB_NUMBER = ?) OR **(? IS NULL))**
  AND ((TI.ITEM_NUMBER = ?) OR **(? IS NULL))**
  AND ((TP.PHASE_CODE STARTING WITH ?) OR **(? IS NULL))**
ORDER BY TP.PHASE_CODE

非常感谢您的帮助。

如果您没有使用Firebird 2.5(但版本2.0或更高版本),或者如果您使用的驱动程序不支持Firebird 2.5中引入的
SQL\u NULL
数据类型,那么您需要使用显式的
CAST
,例如

SELECT *
FROM TLPE_ITEMS TI
WHERE TI.ITEM_NUMBER = ? OR CAST(? AS INTEGER) IS NULL
这会将第二个参数标识为驾驶员(和Firebird)的
整数,允许您将其设置为
NULL

现在,您参考的faq提到将值强制转换为适当的数据类型,它们的意思是不应强制转换为可能导致转换错误的数据类型(如果该数据类型不是null)

在我的示例中,我强制转换为
整数
,但是如果值实际上是字符串,并且您使用say
“IX0109302”
作为值,您将得到一个转换错误,因为它不是适当的
整数
。为了避免这种情况,您需要强制转换为足够长的
(VAR)CHAR
(否则会出现截断错误)


如果您使用的是Firebird 1.5或更早版本,那么这个技巧将不起作用,请参阅,在这种情况下,您可能会使用类似于
TI.ITEM_NUMBER=?或“T”=?
,其中您将第二个参数设置为
'T'
(true)或
'F'
(false),以表示您是否想要所有东西;这意味着您需要将空检测移到调用代码。

我在某个地方读到,通过执行
WHERE字段(如“%”| |?| |“%”选择空参数时,可以显示下拉列表中的所有选项但到目前为止,我还不能让它工作,我一直收到一个“意外的命令结束”错误。你在使用Firebird 2.5吗?如果是,您使用的是哪个驱动程序(+版本)?可能是驱动程序本身不支持使用
所需的
SQL\u NULL
数据类型?是NULL
没有castsThanks标记,我正在使用Firebird 2.0,因此我将尝试转换为适当的数据类型。我知道我的C.AREA_ID是一个整数,所以我尝试了以下操作:
其中(C.AREA_ID=1)或(C.AREA_ID=?)或CAST(?AS integer)为NULL
,但我仍然得到“数据类型未知”错误。我将看看是否可以重现它。谢谢,我不知道如何继续。我只是尝试了一个非常类似于我对Firebird 2.0.7的回答中的问题,它的工作原理与我预期的一样,这进一步证实了它在Firebird 2.0 beta 1中得到了修复。我使用了Firebird JDBC驱动程序。您正在使用哪个驱动程序(+版本)?