搜索所有值之间的SQL

时间:2014-05-29 20:30:11

标签: sql

我有数据结构后的数据..

   _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)

3 个答案:

答案 0 :(得分:1)

小于 <大于 >运算符的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)

您最好更改列的类型,以避免出现歧义,以便以后使用。

答案 1 :(得分:0)

这将是明显的答案......

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

如果数据是字符串(假设我们不知道什么是DB),你可以添加它。

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

如果你关心性能并且你有很多数据和索引,你就不希望在列值上包含函数调用..你可以在这个转换内嵌,但这可以保证你的谓词是{{ 3}}

答案 2 :(得分:0)

    SELECT * FROM myTable
    WHERE 
    (CAST(@theInput AS char) >= a._BEGIN AND @theInput < a.END);

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

SQL "between" not inclusive

MySQL "between" clause not inclusive?

当我这样做的查询时,我通常尝试使用大于/小于任何一方的一方并从那里开始工作。也许这可以帮助。我很慢,但我做了很多试验和错误。

或者,使用Tony的转换。

我认为您可以将它们转换为适合您的程序,数字或文本的任何内容。

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

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