首页 > 解决方案 > 如何检查Oracle sql中列之间单词的前两个字符是否相等

问题描述

我正在尝试比较原始字符串和屏蔽字符串是否相等。我想比较每个单词的前两个字符是否相同。我正在使用 Oracle sql 12c。

例如,假设我有一个User表和列,name_request并且name_response这些记录的比较应该返回 true:

| name_request       | name_response      |
+--------------------+--------------------+
| steve jobs         | st*** jo**         |
| sergey george brin | se**** ge**** br** |

这些记录为假:

| bill gates         | jo** he***         |
| steve jhon wozniak | he*** va**         |

任何人都可以帮助我吗?

标签: sqloracle

解决方案


如果您使用 SQL Server 2017+ 并想尝试基于 JSON 的方法,您可以使用以下语句。这种方法的重要部分是将名称转换为有效的 JSON 数组(steve jobs转换为["steve","jobs"])。之后,使用OPENJSON(),您可以解析此数组并匹配originalencrypted名称中的每个部分:

桌子:

CREATE TABLE Users (
   name_request varchar(100), 
   name_response varchar(100)
)
INSERT INTO Users
   (name_request, name_response)
VALUES   
   ('steve jobs',         'st*** jj**'),
   ('steve jobs',         'st*** jo**'),
   ('sergey george brin', 'se**** ge**** br**'),
   ('bill gates',         'jo** he***'),
   ('steve jhon wozniak', 'he*** va**')

陈述:

SELECT 
   u.*, 
   CASE WHEN a.words = a.matches THEN 'true' ELSE 'false' END AS result
FROM Users u
OUTER APPLY (
   SELECT 
      SUM(1) AS [words],
      SUM(CASE WHEN LEFT(j1.[value], 2) = LEFT(j2.[value], 2) THEN 1 ELSE 0 END) AS [matches]
   FROM OPENJSON(CONCAT('["', REPLACE(STRING_ESCAPE(u.name_request, 'json'), ' ', '","'), '"]')) j1
   FULL JOIN OPENJSON(CONCAT('["', REPLACE(STRING_ESCAPE(u.name_response, 'json'), ' ', '","'), '"]')) j2 
      ON j1.[key] = j2.[key]
) a

结果:

----------------------------------------------
name_request        name_response       result
----------------------------------------------
steve jobs          st*** jj**          false
steve jobs          st*** jo**          true
sergey george brin  se**** ge**** br**  true
bill gates          jo** he***          false
steve jhon wozniak  he*** va**          false

推荐阅读