很明显,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
绝对不行。
请尝试以下基于代币化的解决方案。
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 |