Sql server 在有序值之间

Sql server 在有序值之间,sql-server,powerbuilder,Sql Server,Powerbuilder,我有一个员工表和一个程序,其中显示了一些查询条件,用户可以使用这些条件进行选择,例如,用户可以使用员工ID搜索员工(或一组员工),但是,我允许用户选择一系列ID进行搜索 在此实现中,DB保存ID的字符串值,它们如下所示: select * from employees where id_employee BETWEEN '000001' AND '000056' select * from empleados where id_empleado BETWEEN 56 AND 1 SELE

我有一个员工表和一个程序,其中显示了一些查询条件,用户可以使用这些条件进行
选择
,例如,用户可以使用员工ID搜索员工(或一组员工),但是,我允许用户选择一系列ID进行搜索

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

select * from  employees where id_employee BETWEEN '000001' AND '000056'
select * from  empleados where id_empleado BETWEEN 56 AND 1
SELECT * from employees WHERE id_employee BETWEEN :Parameter1 AND :Parameter2
'000001'、'000002'…、'000200'等等,它们既是字符串,也是数字。因此,当我提出这样的查询时:

select * from  employees where id_employee BETWEEN '000001' AND '000056'
select * from  empleados where id_empleado BETWEEN 56 AND 1
SELECT * from employees WHERE id_employee BETWEEN :Parameter1 AND :Parameter2
我得到了预期的结果,但当我这样做时:

select * from  empleados where id_empleado BETWEEN '000056' AND '000001'
我什么也没有得到,似乎SQLServer将值视为整数或十进制值,因此无法获得结果

我可以在我使用的标准窗口中进行验证,但是我想知道是否有一种方法可以将其设置为DB的默认值,或者任何可以避免我必须更改大约100个标准窗口的方法

提前谢谢


编辑:我不是在争论BETWEEN操作符的功能,而是在寻找一种方法来继续使用它,告诉SQLServer以我应该使用的方式来使用它???

我有点奇怪,您希望将FK存储在此处显示的表单中。为了实现这一点,我建议您对FK使用整数值,然后只需执行如下查询:

select * from  employees where id_employee BETWEEN '000001' AND '000056'
select * from  empleados where id_empleado BETWEEN 56 AND 1
SELECT * from employees WHERE id_employee BETWEEN :Parameter1 AND :Parameter2

即使使用数值,结果也是一样的。SQL将v1和v2之间的
转换为
=v1和
之间的
总是期望
。当值反转时(
),您会遇到麻烦

如果您使用的是参数化查询(强烈建议),则会有一个“条件”窗口,将用户的选择作为参数传递到查询中,这意味着您的查询如下所示:

select * from  employees where id_employee BETWEEN '000001' AND '000056'
select * from  empleados where id_empleado BETWEEN 56 AND 1
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
;
选择*
来自员工
你的雇员在哪里
之间
案例
当:参数1>=:参数2
然后:参数2
其他:参数1
结束
及
案例
何时:参数2如何:

select * from  employees where (id_employee BETWEEN '000001' AND '000056') or (id_employee BETWEEN '000056' AND '000001')
在具有两个参数lim1和lim2(定义为字符串)的Powerbuilder语言中:


问题。。。究竟为什么要将FK存储为字符串值?按原样将其设置为适当的INT非空值。如果我理解正确的话,你应该把这些值转换成nvarchar来让它工作……可能是@User987的重复我不是DB管理员,只是一个程序员,当我开始在这里工作时,它已经是这样了,这是一个大程序,所以是的,我想我们不会改变它。所有的FK大部分都是字符串。我认为他肯定应该在他的表中更改FK的类型。FK的这种数据类型是完全错误的,尤其是在他保存它的形式“0000056”中。我知道结果是一样的,有没有办法告诉SQLServer忽略给定参数的顺序,并使用较小的值对较大的值进行查询?@DavidMerinos没有,没有。不在SQL Server中,不在Oracle中,不在MySql或PosgreSQL中。这是默认的ANSI SQL:BETWEEN如果test_表达式的值大于或等于begin_表达式的值且小于或等于end_表达式的值,则返回TRUE。好的,关闭问题并准备更改大约100多个验证窗口。如果程序确实有参数化查询,这将是一个非常好的解决方案,但是没有,我们对每个窗口都使用dynamyc查询,这是一个ERP。是的,你可以想象有多少这样的查询在那里。谢谢你的时间@戴维德梅里诺斯相信我,我感觉到你的痛苦。