有一种方案可以从源表中存在范围条件的表中选择值。
就像
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)
我已经看到了可以将范围与输入值进行比较的其他方法的解决方案,但是此处范围在源表中存在。请帮忙。
答案 0 :(得分:3)
如果我正确理解了您的要求,可以使用
SELECT TOP 1 B.*
FROM TableB B
WHERE B.Name LIKE (SELECT CONCAT('[',condition,']%') FROM TableA WHERE ID =1)
ORDER BY B.Id
答案 1 :(得分:2)
如果我的理解正确,您应该将TableA
的结构构造为:
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);
但我不建议这样做。最好将条件存储在两列中。
答案 2 :(得分:1)
我将使用 QUOTENAME()
功能
SELECT *
FROM TableA
WHERE @Condition LIKE QUOTENAME(Condition);
这将是
WHERE 'C' LIKE [A-M] --return True
答案 3 :(得分:0)
始终应尝试添加数据和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%'