类似 SQL Server 的函数使用列值而不是字符串

问题描述 投票:0回答:1

很明显,like 函数不适用于实际的列值。 有谁知道如何让它发挥作用? 或者有可行的替代方案吗? 这就是我想要实现的目标:

sfirstname   slastname       sccholdername
SCOTT        DREWYOR         KENT/MICHELLE
STEPHANIE    PIERSON         PIERSON/STEPHANIE
AMBER D      LINDSEY         MURRAY/AMBER
ALEXIA       SNELL           SNELL/D
JOHN         MESSING         MESSING/JOHN

在上面的列表中,查看 sccholdername 的每个实例中如何包含客户的名字或姓氏。 除了斯科特·德罗伊尔。 这可能意味着此人的帐户附加了错误的信用卡。 我需要能够运行一个脚本来识别 sccholdername 列中没有 sfirstname 或 slastname 的每个实例。

我尝试过以下基础知识:

select *
from customers
where sccholddername not like sfirstname
or sccholdername not like slastname

绝对不行。

sql sql-server
1个回答
0
投票

请尝试以下基于代币化的解决方案。

XQuery 的量化表达式发挥了所有魔力:量化表达式 (XQuery)

用空格分隔的每个单词都被视为一个标记,而不是整个列值。请参阅第 3 行作为具体示例:

<root>
  <source>
    <r>AMBER</r>
    <r>D</r>
    <r>LINDSEY</r>
  </source>
  <target>
    <r>MURRAY</r>
    <r>AMBER</r>
  </target>
</root>

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (id INT IDENTITY PRIMARY KEY, sfirstname VARCHAR(20), slastname VARCHAR(20), sccholdername VARCHAR(100));
INSERT @tbl (sfirstname, slastname, sccholdername) VALUES
('SCOTT',       'DREWYOR', 'KENT/MICHELLE'),
('STEPHANIE',   'PIERSON', 'PIERSON/STEPHANIE'),
('AMBER D',     'LINDSEY', 'MURRAY/AMBER'),
('ALEXIA',      'SNELL  ', 'SNELL/D'),
('JOHN',        'MESSING', 'MESSING/JOHN');
-- DDL and sample data population, end

DECLARE @separator1 CHAR(1) = SPACE(1)
   , @separator2 CHAR(1) = '/';

WITH rs AS
(
    SELECT * 
        , x.value('some $r in /root/source/r/text()
            satisfies $r = /root/target/r/text()', 'BIT') AS Result
    FROM @tbl AS t
    CROSS APPLY (SELECT TRY_CAST('<root>' + 
        '<source><r><![CDATA[' + REPLACE(sfirstname + @separator1 + slastname, @separator1, ']]></r><r><![CDATA[') + 
        ']]></r></source>' + 
        '<target><r><![CDATA[' + REPLACE(sccholdername, @separator2, ']]></r><r><![CDATA[') + 
        ']]></r></target>' + 
        '</root>' AS XML)
        ) AS t1(x)
)
SELECT * FROM rs
--WHERE Result = 0;

输出

id 名字 姓氏 scc持有者姓名 结果
1 斯科特 德鲁约尔 肯特/米歇尔 0
2 斯蒂芬妮 皮尔森 皮尔森/斯蒂芬妮 1
3 琥珀D 林赛 穆雷/琥珀 1
4 亚历克西娅 斯内尔 斯内尔/D 1
5 约翰 混乱 梅辛/约翰 1
© www.soinside.com 2019 - 2024. All rights reserved.