在 nvarchar 列上使用 between 子句查找范围不起作用

问题描述

我有 3 个 nvarchar 列 user_3、user_4 和 description。我正在设置是和否标志。如果描述列中的值等于或介于 user_3 和 User4 之间,则将该标志设置为 'N' 否则 将标志设置为“Y”。

这是我目前编写的 SQL 脚本。它在某些情况下有效,但并非总是如此。查看带有结果的图像。例如,它在第 1 行工作,但在第 6 行不起作用。我做错了什么?

SELECT  [B].USER_3,[B].USER_4,A.DESCRIPTION,(case when Isnumeric(A.DESCRIPTION) <> 1 then 'Y' 
else case when (CASE WHEN Isnumeric(A.DESCRIPTION) = 1 then
cast(A.DESCRIPTION AS decimal(10,5)) else 0 end) 
between ( CASE WHEN Isnumeric([B].USER_4) = 1 then 
cast([B].USER_4 AS decimal(10,5)) else 0 end) and
(CASE WHEN Isnumeric([B].USER_3) = 1 then cast([B].USER_3  AS decimal(10,5)) else 0 end)
then 'N' else 'Y' end end) as Flagset
from A,B

结果截图如下

enter image description here

解决方法

问题在于您根据 docs 使用 BETWEEN

如果 test_expression 的值大于或等于 begin_expression 的值且小于或等于 end_expression 的值,则 BETWEEN 返回 TRUE。

因为不知道USER_3还是USER_4是上限还是下限,所以需要两种方式都测试。

注意:对于这种查询,我更喜欢预先计算我需要的所有值(在这种情况下使用 CROSS APPLY)。它使跟踪和调试变得更加容易。

SELECT USER_3,USER_4,[DESCRIPTION],CASE WHEN ISNUMERIC([DESCRIPTION]) <> 1 THEN 'Y' ELSE
        CASE WHEN CASE WHEN ISNUMERIC([DESCRIPTION]) = 1 THEN CAST([DESCRIPTION] AS decimal(10,5)) ELSE 0 END BETWEEN CASE WHEN ISNUMERIC(USER_4) = 1 THEN CAST(USER_4 AS decimal(10,5)) ELSE 0 END AND
        CASE WHEN ISNUMERIC(USER_3) = 1 THEN CAST(USER_3  AS decimal(10,5)) ELSE 0 END
    THEN 'N' ELSE 'Y' END END AS Flagset,CASE WHEN DNUMERIC <> 1 THEN 'Y' ELSE CASE WHEN DESCRIPTIOND BETWEEN USER_4D AND USER_3D OR DESCRIPTIOND BETWEEN USER_3D AND USER_4D THEN 'N' ELSE 'Y' END END CorrectedFlagSet

FROM (VALUES
    ('1.395','1.385','1.390'),('22.025','41.425','22'),'23.025')
) AS X (USER_3,[DESCRIPTION])
CROSS APPLY (VALUES (
    CASE WHEN ISNUMERIC(USER_3) = 1 THEN CAST(USER_3 AS decimal(10,5)) ELSE 0 END,CASE WHEN ISNUMERIC(USER_4) = 1 THEN CAST(USER_4 AS decimal(10,CASE WHEN ISNUMERIC([DESCRIPTION]) = 1 THEN CAST([DESCRIPTION] AS decimal(10,CASE WHEN ISNUMERIC([DESCRIPTION]) = 1 THEN 1 ELSE 0 END
)) AS Y (USER_3D,USER_4D,DESCRIPTIOND,DNUMERIC);

返回:

USER_3 USER_4 描述 旗帜 CorrectedFlagSet
1.395 1.385 1.390 N N
22.025 41.425 22
22.025 41.425 23.025 N

我确定我不必提及您应该首先以数字形式存储这些数据,因为它会表现得更好并为您节省许多未来的问题。

布局合理、大小写一致的查询也有助于理解和调试它们。

最后提供一个包含示例数据、您的查询和您想要的结果的最小可重现示例,如下所示,让人们更容易提供帮助。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...