在部分字符串匹配上连接表

cod*_*ori 0 join sql-server t-sql

输入:我有一个包含(任意数量)用户提供的字符串的表:

?????????
? Value ?
?????????
? To    ?
? An    ?
?????????
Run Code Online (Sandbox Code Playgroud)

以及用户详细信息表:

?????????????????????
? UserID ? UserName ?
?????????????????????
?     12 ? Tom      ?
?    132 ? Ann      ?
?     32 ? Dina     ?
?      2 ? Mark     ?
?????????????????????
Run Code Online (Sandbox Code Playgroud)

我需要一个查询来返回用户表中的所有记录,其中UserNameValue输入表中任何记录的部分字符串匹配。这种情况下的预期输出是:

?????????????????????
? UserID ? UserName ?
?????????????????????
?     12 ? Tom      ?
?    132 ? Ann      ?
?????????????????????
Run Code Online (Sandbox Code Playgroud)

Pau*_*ite 7

这应该做你想做的:

DECLARE @Users AS TABLE
(
    UserID      integer,
    UserName    nvarchar(50)
);

INSERT @Users
    (UserID, UserName)
VALUES
    (12, N'Tom'),
    (132, N'Ann'),
    (32, N'Dina'),
    (2, N'Mark');

DECLARE @Input AS TABLE
(
    Value    nvarchar(500) NOT NULL
);

INSERT @Input (Value)
VALUES 
    (N'To'),
    (N'An');

SELECT * 
FROM @Users AS u 
WHERE 
    EXISTS 
    ( 
        SELECT * 
        FROM @Input AS i 
        WHERE 
            u.UserName LIKE N'%' + i.Value + N'%'
    );
Run Code Online (Sandbox Code Playgroud)

输出:

?????????????????????
? UserID ? UserName ?
?????????????????????
?     12 ? Tom      ?
?    132 ? Ann      ?
?????????????????????
Run Code Online (Sandbox Code Playgroud)


Pau*_*ite 5

根据您之前的问题SQL 查询组合而无需重复的上下文,我认为您正在寻找一种方法来查找用户组合并在结果集中包含名称和 ID。以下脚本演示了实现该目标的一种方法:

样本数据:

DECLARE @Users AS TABLE
(
    UserID      integer,
    UserName    nvarchar(50)
);

INSERT @Users
    (UserID, UserName)
VALUES
    (12, N'Tom'),
    (132, N'Ann'),
    (32, N'Dina'),
    (2, N'Mark');
Run Code Online (Sandbox Code Playgroud)

将源数据加载到一个表中,以便更容易地找到组合:

-- Working table to find combinations
DECLARE @Combination AS TABLE 
(
    item_id     tinyint IDENTITY(1,1) PRIMARY KEY NONCLUSTERED,
    item        nvarchar(500) NOT NULL,
    item_value  integer NOT NULL,
    bit_value   AS 
                CONVERT
                (
                    integer, 
                    POWER(2, item_id - 1)
                )
                PERSISTED UNIQUE CLUSTERED
);    

-- Add user details to the working table
INSERT @Combination
    (item, item_value)
SELECT
    u.UserName,
    u.UserID
FROM @Users AS u;
Run Code Online (Sandbox Code Playgroud)

使用这样一个事实,即自然整数具有与我们想要找到的组合相匹配的位模式。根据工作表中的项数确定我们需要的最大整数值:

-- Maximum integer needed for combination bit values
DECLARE 
    @max integer = 
    POWER(2,
        (
            SELECT COUNT_BIG(*) 
            FROM @Combination
        )
    ) - 1;
Run Code Online (Sandbox Code Playgroud)

不要使用 连接组成员FOR XML PATH,而是使用列出行中的组合group_id以标识每个组:

-- Find combinations
SELECT
    group_id = N.n,
    c.item,
    c.item_value
FROM @Combination AS c
JOIN dbo.Numbers AS N ON
    n.n & c.bit_value = c.bit_value
WHERE
    N.n BETWEEN 1 AND @max
ORDER BY
    group_id;
Run Code Online (Sandbox Code Playgroud)

部分输出:

????????????????????????????????
? group_id ? item ? item_value ?
????????????????????????????????
?        1 ? Tom  ?         12 ?
?        2 ? Ann  ?        132 ?
?        3 ? Ann  ?        132 ?
?        3 ? Tom  ?         12 ?
?        4 ? Dina ?         32 ?
?        5 ? Dina ?         32 ?
?        5 ? Tom  ?         12 ?
?        6 ? Ann  ?        132 ?
?        6 ? Dina ?         32 ?
?        7 ? Dina ?         32 ?
?        7 ? Ann  ?        132 ?
?        7 ? Tom  ?         12 ?
?        8 ? Mark ?          2 ?
?        9 ? Mark ?          2 ?
?        9 ? Tom  ?         12 ?
????????????????????????????????
Run Code Online (Sandbox Code Playgroud)