在源表中使用Range条件选择的SQL查询

时间:2018-12-28 14:58:53

标签: 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,     

-- Here C is item name starts with 
-- Should compare with range (A-M) and return first row.
-- Condition column is varchar(3)

我已经看到了可以将范围与输入值进行比较的其他方法的解决方案,但是此处范围在源表中存在。请帮忙。

4 个答案:

答案 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

Demo1

Demo2

答案 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%'