Delphi 按筛选器属性在整数字段中进行类似搜索

Delphi 按筛选器属性在整数字段中进行类似搜索,delphi,delphi-xe2,tadotable,Delphi,Delphi Xe2,Tadotable,我有一个ADODataSet,其中“Filtered”属性设置为True(Filtered:= 是的;) 应用过滤器时: [No] like '2%' 弹出一个错误“过滤器无法打开”。[否]是中的一个字段 整数类型的数据集。当我对字符串列应用类似的过滤器时,效果很好 e、 g: 有什么想法吗 谢谢 我同意Ken的观点,如果您要查找20到29或200到299的数值,请根据这些数值进行搜索。如果您仍然想按照您的要求去做,请考虑TADODATABASE的筛选器属性与向查询中添加“WHE”子句不相同。

我有一个ADODataSet,其中“Filtered”属性设置为True(Filtered:= 是的;)

应用过滤器时:

[No] like '2%'
弹出一个错误“过滤器无法打开”。[否]是中的一个字段 整数类型的数据集。当我对字符串列应用类似的过滤器时,效果很好

e、 g:

有什么想法吗


谢谢

我同意Ken的观点,如果您要查找20到29或200到299的数值,请根据这些数值进行搜索。如果您仍然想按照您的要求去做,请考虑TADODATABASE的筛选器属性与向查询中添加“WHE”子句不相同。where子句将使用服务器的语法在服务器端处理。另一方面,Filter属性在您的软件中进行解析,并具有自己的语法规则

选项一是使用实际where子句。在我的测试中,我使用的是MS SQL Server。我将SQL文本更改为:

select [LASTNAME], [NO] from PEOPLE
where [NO] like '2%'
在这种情况下,MSSQL的语法规则将在应用筛选器之前将数值转换为字符串

选项二是更改查询以返回字符串

select [LASTNAME], [NO],
cast ( [NO] as varchar(20) ) as [NO_AS_CHAR] 
from PEOPLE
然后将过滤器更改为

[NO_AS_CHAR] like '2%'

我同意Ken的观点,如果你在寻找数值20到29或200到299,那么就根据这些数值进行搜索。如果您仍然想按照您的要求去做,请考虑TADODATABASE的筛选器属性与向查询中添加“WHE”子句不相同。where子句将使用服务器的语法在服务器端处理。另一方面,Filter属性在您的软件中进行解析,并具有自己的语法规则

选项一是使用实际where子句。在我的测试中,我使用的是MS SQL Server。我将SQL文本更改为:

select [LASTNAME], [NO] from PEOPLE
where [NO] like '2%'
在这种情况下,MSSQL的语法规则将在应用筛选器之前将数值转换为字符串

选项二是更改查询以返回字符串

select [LASTNAME], [NO],
cast ( [NO] as varchar(20) ) as [NO_AS_CHAR] 
from PEOPLE
然后将过滤器更改为

[NO_AS_CHAR] like '2%'

您希望像2这样的整数
是什么?整数是数字,所以可以将它们作为数字使用。当您查找20到29之间的整数值时,您不会查找像2这样的整数
,而是查找20到29之间的数字<像@TLama所说的那样,code>LIKE
用于字符(字符串)字段,而不是其他任何字段。msSQL中是否有将int转换为字符串的函数?在Firebird服务器中,我可以像“2%”这样进行强制转换(不作为VarChar(10)),或者像“2%”这样的(“| |不)这样。您希望像2这样的整数
是什么?整数是数字,所以可以将它们作为数字使用。当您查找20到29之间的整数值时,您不会查找像2这样的整数
,而是查找20到29之间的数字<像@TLama所说的那样,code>LIKE
用于字符(字符串)字段,而不是其他任何字段。msSQL中是否有将int转换为字符串的函数?在Firebird服务器中,我可以像“2%”那样进行CAST(不作为VarChar(10)),或者像“2%”那样进行CAST(不作为VarChar(10)),诸如此类。这两个选项都没有任何意义。正如我之前解释的,没有像2%
那样的数字(整型)值
,因为这不是处理数字的方式。除非有人对列使用了完全错误的数据格式,否则将其强制转换为字符串以进行无效的无意义选择不是正确的解决方案。(在这种情况下,正确的答案是“将列类型更改为正确的,如果这不是一个选项,那么这里有一个糟糕的解决方法”)。我没有投反对票,但我无法根据逻辑更新一个毫无意义的答案。:-)正如我所说的,肯,我同意你的看法。从原始帖子的上下文来看,我同意您的猜测,[NO]列包含一个标识符,例如员工编号。它不是一个数值,也就是说,员工编号为“2173”并不意味着有273个。无论是谁设计了数据库模式,都使用了数字类型,可能是因为他们不理解其区别,或者可能是因为他们需要较小的数据类型来提高性能。我同意更改数据类型是理想的,但这可能不是海报的可用解决方案。:-)您误解了。我的反对意见是,您根本没有建议更改数据类型,这当然是首选的修复方法,然后提供转换的替代方法作为解决方案。然而,我认为这种转换在这种情况下也是不对的;如果是4位员工ID,更好的查询应该是
,其中[No]介于2000和2999之间
,这是数据的正确使用,完全避免了转换。:-)这两种选择都没有任何意义。正如我之前解释的,没有像2%
那样的数字(整型)值
,因为这不是处理数字的方式。除非有人对列使用了完全错误的数据格式,否则将其强制转换为字符串以进行无效的无意义选择不是正确的解决方案。(在这种情况下,正确的答案是“将列类型更改为正确的,如果这不是一个选项,那么这里有一个糟糕的解决方法”)。我没有投反对票,但我无法根据逻辑更新一个毫无意义的答案。:-)正如我所说的,肯,我同意你的看法。从原始帖子的上下文来看,我同意您的猜测,[NO]列包含一个标识符,例如员工编号。它不是一个数值,也就是说,员工编号为“2173”并不意味着有273个。无论是谁设计了数据库模式,都使用了数字类型,可能是因为他们不理解其区别,或者可能是因为他们需要较小的数据类型来提高性能。我同意更改数据类型是理想的,但这可能不是海报的可用解决方案。:-)您误解了。我的反对意见是,您根本没有建议更改数据类型,这当然是首选的修复方法,然后