我有数据结构后的数据..
_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)
答案 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的示例 - 标准兼容性更改UNSIGNED
到INTEGER
]
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);
我还看到了几个相同类型的问题:
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?