在有序值之间
Between ordered values
我有 table 名员工和一个显示用户可用于 SELECT
的查询条件的程序,例如,用户可以搜索一名员工(或一组其中)通过使用员工 ID,但是,我让用户 select 一系列 ID 来进行搜索。
在此实现中,数据库保存 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 视为整数或小数值,因此无法获得结果。
我可以在我使用的标准 window 中进行验证,但我想知道是否有办法让它成为数据库的默认值或任何可以避免我不得不更改其中大约 100 个的方法标准 windows。
提前致谢。
编辑:我不是在争论 BETWEEN 运算符的功能,而是通过告诉 SQLServer 按照我应该使用它的方式来寻找一种仍然使用它的方法?
我觉得您想以此处显示的形式存储 FK 有点奇怪。为了完成这项工作,我建议您为 FK 使用整数值,然后简单地执行如下查询:
select * from empleados where id_empleado BETWEEN 56 AND 1
即使您使用数值,结果也是一样的。 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
但是结果是一样的
BETWEEN
总是期望 <smaller value> AND <larger value>
。当值颠倒 (<larger value> AND <smaller value>
) 时,您 运行 就会遇到麻烦。
如果您使用参数化查询(强烈推荐),那么您有一个条件 window,它将用户的选择作为参数传递到查询中,这意味着您的查询如下所示:
SELECT * from employees WHERE id_employee BETWEEN :Parameter1 AND :Parameter2
如果是这种情况,那么您希望通过将查询更改为 运行 来解决问题 CASE
对参数进行 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'
,或者vice-versa都没有关系;无论哪种方式,返回的结果都是相同的。
如果每个条件 window 使用相同的基本逻辑,那么您可能无法避免在每个条件中都进行更改。
然而,这是一个很好的例子,说明使用集中查询(例如存储过程)如何帮助您节省工作。如果您的所有条件 windows 都在执行存储过程或类似的已保存查询,您只需更新该中央查询,所有 windows 就会开始正常工作。
但是,如果每个 window 运行 都有自己的动态查询,您将别无选择,只能去 window-by-window 并更改此功能。
怎么样:
select * from employees where (id_employee BETWEEN '000001' AND '000056') or (id_employee BETWEEN '000056' AND '000001')
在具有两个参数 lim1 和 lim2(定义为字符串)的 Powerbuilder 语言中:
select * from employees where (id_employee BETWEEN :lim1 AND :lim2) or (id_employee BETWEEN :lim2 AND :lim1)
我有 table 名员工和一个显示用户可用于 SELECT
的查询条件的程序,例如,用户可以搜索一名员工(或一组其中)通过使用员工 ID,但是,我让用户 select 一系列 ID 来进行搜索。
在此实现中,数据库保存 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 视为整数或小数值,因此无法获得结果。
我可以在我使用的标准 window 中进行验证,但我想知道是否有办法让它成为数据库的默认值或任何可以避免我不得不更改其中大约 100 个的方法标准 windows。
提前致谢。
编辑:我不是在争论 BETWEEN 运算符的功能,而是通过告诉 SQLServer 按照我应该使用它的方式来寻找一种仍然使用它的方法?
我觉得您想以此处显示的形式存储 FK 有点奇怪。为了完成这项工作,我建议您为 FK 使用整数值,然后简单地执行如下查询:
select * from empleados where id_empleado BETWEEN 56 AND 1
即使您使用数值,结果也是一样的。 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
但是结果是一样的
BETWEEN
总是期望 <smaller value> AND <larger value>
。当值颠倒 (<larger value> AND <smaller value>
) 时,您 运行 就会遇到麻烦。
如果您使用参数化查询(强烈推荐),那么您有一个条件 window,它将用户的选择作为参数传递到查询中,这意味着您的查询如下所示:
SELECT * from employees WHERE id_employee BETWEEN :Parameter1 AND :Parameter2
如果是这种情况,那么您希望通过将查询更改为 运行 来解决问题 CASE
对参数进行 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'
,或者vice-versa都没有关系;无论哪种方式,返回的结果都是相同的。
如果每个条件 window 使用相同的基本逻辑,那么您可能无法避免在每个条件中都进行更改。
然而,这是一个很好的例子,说明使用集中查询(例如存储过程)如何帮助您节省工作。如果您的所有条件 windows 都在执行存储过程或类似的已保存查询,您只需更新该中央查询,所有 windows 就会开始正常工作。
但是,如果每个 window 运行 都有自己的动态查询,您将别无选择,只能去 window-by-window 并更改此功能。
怎么样:
select * from employees where (id_employee BETWEEN '000001' AND '000056') or (id_employee BETWEEN '000056' AND '000001')
在具有两个参数 lim1 和 lim2(定义为字符串)的 Powerbuilder 语言中:
select * from employees where (id_employee BETWEEN :lim1 AND :lim2) or (id_employee BETWEEN :lim2 AND :lim1)