要使用源表中的范围条件选择的SQL查询
有一个场景可以从源表中存在范围条件的表中选择值 像要使用源表中的范围条件选择的SQL查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,有一个场景可以从源表中存在范围条件的表中选择值 像 TableA ID value condition 1 20 A-M 2 50 N-Z Select value from TableA where condition = 'C%' --want to select TableA value from TableB by passing person name starts with like, -- Her
TableA
ID value condition
1 20 A-M
2 50 N-Z
Select value from TableA where condition = 'C%'
--want to select TableA value from TableB by passing person name starts with like,
-- Here C is item name starts with
-- Should compare with range (A-M) and return first row.
-- Condition column is varchar(3)
我已经从另一个方面看到了解决方案,其中范围可以与输入值进行比较,但这里范围显示在源表中。请帮助。如果我理解正确,您应该将
表A的结构设置为:
ID value Lower Upper
1 20 A M
2 50 N Z
那么你想要:
select a.*
from tableA a
where left(@name, 1) between a.lower and a.upper;
您可以通过执行以下操作使其与您的格式配合使用:
select a.*
from tableA a
where left(@name, 1) between left(a.condition) and right(a.condition);
但我不建议这样做。最好将条件存储在两列中。如果我理解正确,您应该将表A的结构设置为:
ID value Lower Upper
1 20 A M
2 50 N Z
那么你想要:
select a.*
from tableA a
where left(@name, 1) between a.lower and a.upper;
您可以通过执行以下操作使其与您的格式配合使用:
select a.*
from tableA a
where left(@name, 1) between left(a.condition) and right(a.condition);
但我不建议这样做。最好将条件存储在两列中。如果我正确理解了您的要求,您可以使用
SELECT TOP 1 B.*
FROM TableB B
WHERE B.Name LIKE (SELECT CONCAT('[',condition,']%') FROM TableA WHERE ID =1)
ORDER BY B.Id
如果我正确理解了你的意图,你可以使用
SELECT TOP 1 B.*
FROM TableB B
WHERE B.Name LIKE (SELECT CONCAT('[',condition,']%') FROM TableA WHERE ID =1)
ORDER BY B.Id
您应该始终尝试为测试场景添加数据和DDL,以下是我建议的解决方案:
DECLARE @SourceA AS TABLE
(
ID INT,
Value INT,
Condition VARCHAR(100)
);
INSERT INTO @SourceA ( ID ,
Value ,
Condition
)
VALUES ( 1 , -- ID - int
110 , -- Value - int
'A-M' -- Condition - varchar(100)
),(2,250,'N-Z')
DECLARE @Alphabet VARCHAR(200)='A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z';
; WITH MyCTE AS
(
SELECT ID,Value,Condition, SUBSTRING(@Alphabet, PATINDEX('%'+ LEFT(Condition,1) + '%' ,@Alphabet),(LEN(@Alphabet)-PATINDEX('%'+ RIGHT(Condition,1) + '%' ,@Alphabet))+1) AS FormattedCondition
FROM @SourceA
)
SELECT * FROM MyCTE
WHERE MyCTE.FormattedCondition LIKE '%C%'
您应该始终尝试为测试场景添加数据和DDL,以下是我建议的解决方案:
DECLARE @SourceA AS TABLE
(
ID INT,
Value INT,
Condition VARCHAR(100)
);
INSERT INTO @SourceA ( ID ,
Value ,
Condition
)
VALUES ( 1 , -- ID - int
110 , -- Value - int
'A-M' -- Condition - varchar(100)
),(2,250,'N-Z')
DECLARE @Alphabet VARCHAR(200)='A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z';
; WITH MyCTE AS
(
SELECT ID,Value,Condition, SUBSTRING(@Alphabet, PATINDEX('%'+ LEFT(Condition,1) + '%' ,@Alphabet),(LEN(@Alphabet)-PATINDEX('%'+ RIGHT(Condition,1) + '%' ,@Alphabet))+1) AS FormattedCondition
FROM @SourceA
)
SELECT * FROM MyCTE
WHERE MyCTE.FormattedCondition LIKE '%C%'
我将使用函数作为
SELECT *
FROM TableA
WHERE @Condition LIKE QUOTENAME(Condition);
这将是
WHERE 'C' LIKE [A-M] --return True
我将使用函数作为
SELECT *
FROM TableA
WHERE @Condition LIKE QUOTENAME(Condition);
这将是
WHERE 'C' LIKE [A-M] --return True
谢谢您的回复,我对表格A没有太多控制权,有没有办法通过现有表格实现此选择structure@PradeepH . . . 这是答案的第二部分。谢谢你的回答,我对表格没有太多的控制权,有没有办法用现有的表格来实现这个选择structure@PradeepH . . . 这是答案的第二部分。