Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
要使用源表中的范围条件选择的SQL查询_Sql_Sql Server_Tsql - Fatal编程技术网

要使用源表中的范围条件选择的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 . . . 这是答案的第二部分。