【问题标题】:Search Through All Between Values SQL搜索所有值之间的 SQL
【发布时间】:2014-07-19 11:50:33
【问题描述】:

我有数据遵循数据结构..

   _ID             _BEGIN           _END    
    7003            99210            99217        
    7003            10225            10324    
    7003            111111

我想查看每个 _BEGIN 和 _END 并返回输入值在值范围之间的所有行,包括值本身(即,如果 10324 是输入,则将返回第 2 行)

我试过这个过滤器,但它不起作用..

where @theInput between a._BEGIN and a._END


--THIS WORKS 
where convert(char(7),'10400') >= convert(char(7),a._BEGIN) 

--BUT ADDING THIS BREAKS AND RETURNS NOTHING
AND convert(char(7),'10400') < convert(char(7),a._END)

【问题讨论】:

  • 您从查询中得到了什么?哪个数据库?
  • 在这里帮助我们一下-您要查询的@theInput 是什么?查询的其余部分是什么样的?
  • @theInput 例如是 '10226'
  • 因此,您最初的问题是设计问题之一:您不应该让 char(7) 列保存始终为整数的值。如果你可以改变设计,你应该这样做。

标签: sql


【解决方案1】:

小于&lt;大于&gt; 运算符处理xCHAR 数据类型没有任何语法错误,但它可能在语义上出错。看例子:

1 - SELECT 'ab' BETWEEN 'aa' AND 'ac' # returns TRUE

2 - SELECT '2' BETWEEN '1' AND '10' # returns FALSE

以 xCHAR 类型存储的字符 2 的值大于 1xxxxx

所以你应该在这里输入CAST。 [以 MySQL 为例 - 将标准兼容性更改为 UNSIGNEDINTEGER]

WHERE CAST(@theInput as UNSIGNED)
    BETWEEN CAST(a._BEGIN as UNSIGNED) AND CAST(a._END as UNSIGNED)

您最好更改列的类型以避免歧义以供以后使用。

【讨论】:

  • ...如果它基于“第一个字母”呢?他在这里处理数字......你提出的观点如何适用于这里?请注意,OP 已经问了他自己的问题的副本,所以你应该在那里回答。此外,UNSIGNED 类型可能并不存在于所有 RDBMS 上 - 使用普通的 INTEGER 可能会更好。
  • @Clockwork-Muse 我指出了 xCHAR 类型的排序规则 - 其中SELECT 'a' &lt; 'b' 返回1。这也适用于 BETWEEN .. AND .. 运算符。你在 RDBMS 上是对的,但我在 cmets 中回复了关于 MySQL 的 OP 字样。
  • 除非您需要说明为什么这对 NUMBERS 很重要。仅仅提及字母是相当不透明的。您甚至没有明确表示这意味着'2' 大于'11'
  • ...除了您解释了过程的结果,但没有解释为什么
【解决方案2】:
    SELECT * FROM myTable
    WHERE 
    (CAST(@theInput AS char) >= a._BEGIN AND @theInput < a.END);

我也看到了几个相同类型的问题:

SQL "between" not inclusive

MySQL "between" clause not inclusive?

当我做这样的查询时,我通常会在一侧尝试大于/小于任一侧,然后从那里开始工作。也许这会有所帮助。我很慢,但我做了很多试验和错误。

或者,使用托尼的转换。

我想你可以将它们转换为适合你的程序的任何东西,数字或文本。

另外,请参阅此处,http://technet.microsoft.com/en-us/library/aa226054%28v=sql.80%29.aspx。 我不相信你不能在SELECT 中做你的CAST

尼克,这是来自 SO 的 MySQL 版本,MySQL "between" clause not inclusive?

【讨论】:

  • 我认为我的问题是字段 _BEGIN,_END 是 char 类型。我怎样才能将它转换为 int 或者这可能是问题
  • @NickLaMarca 您需要告诉我们您使用的是什么数据库。是带有@的 SQL Server 吗?
  • 转换(整数,a._BEGIN)
  • @Tony 打败了我。我想我可以编辑,但你不会投 @theInput 吗?
  • 您能否显示@Input 以及 2 个字段?
【解决方案3】:

这将是显而易见的答案......

SELECT * 
FROM <YOUR_TABLE_NAME> a
WHERE @theInput between a._BEGIN and a._END 

如果数据是字符串(假设这里我们不知道什么数据库)你可以添加这个。

Declare @searchArg VARCHAR(30) = CAST(@theInput as VARCHAR(30));
SELECT * 
FROM <YOUR_TABLE_NAME> a
WHERE @searchArg between a._BEGIN and a._END 

如果您关心性能并且拥有大量数据和索引,则您不希望在列值上包含函数调用。您可以内联此转换,但这可确保您的谓词是 @987654321 @。

【讨论】:

  • 你用的是什么软件? sql是什么版本的?
  • 我认为我的问题是字段 _BEGIN,_END 是 char 类型。我怎样才能将它转换为 int 或者这可能是问题
  • @NickLaMarca 你在用什么 SQL?微软? DB2?甲骨文? MySQL?
  • 你能告诉我一个转换为 mySQL 和 Microsoft 的吗?我不确定味道。如果有帮助,我正在使用 WinSQL ide
  • convert(integer,_BEGIN) 不起作用,convert 未突出显示为关键字
猜你喜欢
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 2018-07-13
  • 2010-12-20
相关资源
最近更新 更多