Sql 用于进行数值比较的强制转换/筛选字符串

Sql 用于进行数值比较的强制转换/筛选字符串,sql,sql-server,Sql,Sql Server,代码列以字符串形式存储代码,格式为N[filenum]:[value]。 如何有效地格式化/拆分这些代码以进行数值比较 -希望将代码的[fileNum]部分与fileNum进行比较 -如果代码的[value]部分在LowLim和HighLim范围内,则希望检查它 预期结果将是 Table Values Id Code FileNum LowLim HighLim ------------------------------------------------

代码列以字符串形式存储代码,格式为N[filenum]:[value]。 如何有效地格式化/拆分这些代码以进行数值比较

-希望将代码的[fileNum]部分与fileNum进行比较

-如果代码的[value]部分在LowLim和HighLim范围内,则希望检查它

预期结果将是

Table Values
Id     Code       FileNum     LowLim     HighLim
------------------------------------------------

A     N18:35        18         30         40
B     N20:20        18         30         40
B不会出现在结果中,因为代码的[filenum]20与其filenum 18不匹配,即使[value]20在(30..40)的范围内


我曾尝试使用左、右和替换,但都不能称之为优雅的解决方案。谢谢。

这里有一种方法,只要代码的格式是Nx:y,其中x和y可以是任意长度的整数,就可以使用。所以,N18:35会起作用,但N1289:34872也会起作用

DDL和DML语句示例:

Id

----
A     (because A's code [filenum] 18 matches the fileNum 18 and [value] 35 is within the range of the limits (30..40), 
嵌套CTE将代码值拆分为FileNumPart和LimitPart值,首先删除“N”,然后使用CHARINDEX拆分冒号的任一侧,最后使用条件select语句:

DECLARE @tbl TABLE (ID CHAR(1), Code VARCHAR(25), 
    FileNum INT, LowLim INT, HighLim INT)
INSERT INTO @tbl VALUES 
('A', 'N18:35', 18, 30, 40),
('B', 'N20:20', 18, 30, 40),
('C', 'N1289:34872', 1289, 34000, 35000)
试试这个

;WITH cte AS (
    SELECT ID, REPLACE(Code, 'N', '') AS Code
    FROM @tbl
),
cte2 AS (
    SELECT ID, SUBSTRING(Code, 1, CHARINDEX(':', Code) - 1) AS FileNumPart
    ,SUBSTRING(Code, CHARINDEX(':', Code) + 1, LEN(Code) - CHARINDEX(':', Code)) AS LimitPart
    FROM cte
)
SELECT t.ID
FROM cte2
INNER JOIN @tbl t ON cte2.ID = t.ID
WHERE t.FileNum = cte2.FileNumPart AND cte2.LimitPart BETWEEN t.LowLim AND t.HighLim

假设表名为
Test

select * from val where substring(code, 2, CHARINDEX(':', code) - 2) = FileNum
选择Id
从测试
其中(子字符串(子字符串索引(代码“:”,1),2)=FileNum)和
(子字符串(子字符串_索引(代码“,:”,-1),1)>=LowLim and

(SUBSTRING(SUBSTRING_INDEX(code,,:,-1),1)您想要的优雅程度如何?请向我们展示您现有的查询您的其他问题发生了什么?
SELECT Id 
FROM Test 
WHERE (SUBSTRING(SUBSTRING_INDEX(code,':',1),2)=FileNum) and 
      (SUBSTRING(SUBSTRING_INDEX(code,':',-1),1)>=LowLim and 
      (SUBSTRING(SUBSTRING_INDEX(code,':',-1),1)<=HighLim)