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