在有序值之间

时间:2017-02-20 23:23:48

标签: sql-server powerbuilder

我有一个员工表和一个显示用户可以用于SELECT的查询条件的程序,例如,用户可以使用以下内容搜索员工(或一组员工)但是,我让员工选择一系列ID来进行搜索。

在此实现中,DB保存ID的字符串值,它们如下所示:

'000001','000002'......,'000200'等等,虽然是字符串,但它们也是数字。所以当我这样做一个查询时:

select * from  employees where id_employee BETWEEN '000001' AND '000056'

我得到了我期望的结果,但是当我这样做时:

select * from  empleados where id_empleado BETWEEN '000056' AND '000001'

我什么都没得到,似乎SQLServer将valus视为Integers或Decimal值,因此无法获得结果。

我可以在我使用的条件窗口中进行验证,但我想知道是否有办法让它成为数据库的默认设置或任何可以避免我不得不更改大约100个此标准窗口的内容。

提前致谢。

编辑:我不是在争论BETWEEN运算符的功能,而是通过告诉SQLServer以我应该使用它的方式来寻找仍然使用它的方法吗?

4 个答案:

答案 0 :(得分:0)

我想要以您在此处显示的形式存储您的FK,这有点奇怪。为了完成这项工作,我建议您为FK使用整数值,然后只需执行以下查询:

select * from  empleados where id_empleado BETWEEN 56 AND 1

答案 1 :(得分:0)

即使您使用数值,结果也是一样的。 SQL将between v1 and v2翻译为>= v1 and <= v2

declare @emp table (id varchar(10), id2 int);
insert into @emp values
('0001',1),
('0002',2),
('0010',10),
('0020',20),
('0030',30),
('0040',40);

select * from @emp where id between '0010' and '0030'
select * from @emp where id between '0030' and '0010'

select * from @emp where id2 between 10 and 30
select * from @emp where id2 between 30 and 10

您可以将其转换为int:

select * from @emp where cast(id as int) between 10 and 30 

但结果是一样的。

在此处查看:http://rextester.com/IDYU18650

答案 2 :(得分:0)

BETWEEN始终期待<smaller value> AND <larger value>。如果值相反(<larger value> AND <smaller value>),则会遇到麻烦。

如果您正在使用参数化查询(强烈推荐),那么您有一个标准窗口,可以将用户的选项作为参数传递给查询,这意味着您的查询如下所示:

SELECT * from employees WHERE id_employee BETWEEN :Parameter1 AND :Parameter2

如果是这种情况,那么您可以希望通过更改查询以对参数进行CASE比较来检查问题,检查哪个更大,哪个更小,从而解决问题:

SELECT * 
FROM employees
WHERE id_employee
    BETWEEN 
    CASE 
        WHEN :Parameter1 >= :Parameter2 
            THEN :Parameter2 
        ELSE :Parameter1 
    END 
    AND 
    CASE
        WHEN :Parameter2 <= :Parameter1
            THEN :Parameter1
        ELSE :Parameter2
    END
;

这只是你如何写这个的一个例子,但我认为你会得到这个想法。在此查询中,如果您编写:Parameter1 = '00056':Parameter2 = '00001',反之亦然,则无关紧要;无论哪种方式,返回的结果都是相同的。

如果每个标准窗口使用相同的基本逻辑,那么您可能无法避免在每个窗口中更改此内容。

然而,这是一个很好的例子,说明如何使用集中查询(例如存储过程)可以帮助您节省工作。如果所有标准窗口都在执行存储过程或类似保存的查询,则只需更新一个中央查询,所有窗口都将开始正常工作。

但是如果每个窗口都运行自己的动态查询,那么您将无法选择,只能逐个窗口并更改此功能。

答案 3 :(得分:0)

怎么样:

select * from  employees where (id_employee BETWEEN '000001' AND '000056') or (id_employee BETWEEN '000056' AND '000001')

在Powerbuilder语言中使用两个parm lim1和lim2(定义为字符串):

select * from  employees where (id_employee BETWEEN :lim1 AND :lim2) or (id_employee BETWEEN :lim2 AND :lim1)