在 table 和函数的值之间查找

Find between values from table and function

我有以下 table:

Table:

CREATE TABLE t1
(
   cola int,
   colb int,
   colc varchar(10),
   cold varchar(10)
);

cola   colb   colc   cold
-------------------------
2      4      x      z
6      8      ab     zub
10     12     jc     me

我有 return table 值的功能。

函数return:

f_column
----
1
2
5
11

现在我想显示 t1 中的 colc,cold,其中函数结果 f_column 介于 colacolb 之间 table t1.

预期结果:

colc   cold
------------
x      z
jc     me

您需要将函数结果与 table 连接起来。它可能是这样的:

SELECT DISTINCT colc, cold FROM t1 INNER JOIN tf_column WHERE f_column
>= cola AND f_column <= colb

假设 tf_column 是临时的 table,只有一列 (f_column)

考虑到您说函数 returns 是一个数据集,因此 假设 该函数是一个 table 值函数。

对于table值函数,你可以在它上面使用FROM,就像aa table一样(如果你想对它“JOIN”,你必须使用 APPLY)。因此这是一个非常简单的查询:

SELECT t1.colc, t1.cold
FROM dbo.YourFunction (Parameter1, Parameter2) YF
     JOIN dbo.t1 ON YF.f_column BETWEEN t1.cola AND t1.colb;

上面的示例假设您的函数有 2 个参数。您需要对其进行更改,使其与您的相关。

编辑:作为一个完整的工作示例:

USE Sandbox;
GO

CREATE TABLE t1
(
   cola int,
   colb int,
   colc varchar(10),
   cold varchar(10)
);

INSERT INTO dbo.t1 (cola,
                    colb,
                    colc,
                    cold)
VALUES (2,4,'x','z'),
       (6,8,'ab','zub'),
       (10,12,'jc','me');

GO
CREATE FUNCTION f1() RETURNS table
AS RETURN 
    SELECT *
    FROM (VALUES(1),(2),(5),(11)) V(f_column);
GO

SELECT t1.colc, t1.cold
FROM dbo.f1()
     JOIN dbo.t1 ON f1.f_column BETWEEN t1.cola AND t1.colb;

GO
DROP TABLE t1;
DROP FUNCTION f1;

这里有很多假设 也许是 table 值函数? - 不知道它需要的参数,如果有的话

您可以对函数使用 JOIN 或 CROSS APPLY

CREATE FUNCTION f_column ()
RETURNS TABLE
AS RETURN
(
    SELECT Ret =  1
    UNION SELECT 2
    UNION SELECT 5
    UNION SELECT 11

)
GO

CREATE TABLE t1
(
   cola int,
   colb int,
   colc varchar(10),
   cold varchar(10)
);

INSERT INTO dbo.t1
(cola,colb,colc,cold)
VALUES
(2, 4, 'x', 'y') , (6, 8, 'ab', 'zub') , (10, 12, 'jc', 'me') 

SELECT 
 T.colc
,T.cold 
FROM dbo.t1 T
CROSS APPLY dbo.f_column() F WHERE F.Ret BETWEEN T.cola AND T.colb
--JOIN dbo.f_column() F ON F.Ret BETWEEN T.cola AND T.colb

DROP TABLE dbo.t1
DROP FUNCTION f_column