Как проверить, равны ли первые два символа слов между столбцами в Oracle sql - PullRequest
3 голосов
/ 20 марта 2020

Я пытаюсь сравнить, если исходная и замаскированная строки равны. Я хочу сравнить, являются ли первые 2 символа каждого слова одинаковыми или нет. Я использую Oracle sql 12 c.

Например, допустим, у меня есть таблица User и столбцы name_request и name_response, сравнение должно возвращать true для этих записей :

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

и false для этих записей:

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

Может кто-нибудь помочь мне с этим?

Ответы [ 2 ]

3 голосов
/ 20 марта 2020

Я бы просто использовал like:

select u.*,
       (case when name_request like replace(name_response, '*', '_')
             then 'true' else 'false'
        end)
from users u;

Ваше использование * кажется эквивалентным _ в like.

3 голосов
/ 20 марта 2020

Если вы используете SQL Server 2017+ и хотите попробовать подход на основе JSON, вы можете использовать следующее утверждение. Важной частью этого подхода является преобразование имен в действительный массив JSON (steve jobs преобразуется в ["steve","jobs"]). После этого, используя OPENJSON(), вы можете проанализировать этот массив и сопоставить каждую часть из имен original и encrypted:

Таблица:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...