Как сравнить часть строки между двумя столбцами - PullRequest
0 голосов
/ 20 ноября 2018

В той же таблице у меня есть два столбца, каждый из которых имеет строку следующего формата:

| column1                       | column2
--------------------------------|---------------------------------
| Soda: 10, Watter:5, Juice: 12 | Soda: 7, Watter:20, Juice: 15  |

Как создать запрос, в котором я извлекаю только те строки, в которых значение для Water отличается от column1 доcolumn2

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

Попробуйте так:

-- CREATE SAMPLE TABLE
;with strings as
(
SELECT 'Soda: 1, Watter:5, Juice: 4' AS Col1, 'Soda: 5, Watter:5, Juice: 12' AS Col2 UNION ALL
SELECT 'Soda: 2, Watter:1, Juice: 5', 'Soda: 7, Watter:2, Juice: 9' UNION ALL
SELECT 'Soda: 3, Watter:6, Juice: 6', 'Soda: 8, Watter:7, Juice: 10'
)

-- YOUR QUERY
SELECT  *
FROM    strings
WHERE   SUBSTRING(Col1,CHARINDEX('Watter:',Col1)+7,CAST(CHARINDEX(', Juice',Col1) AS int)-CAST(CHARINDEX('Watter:',Col1)+7 AS int))
<> SUBSTRING(Col2,CHARINDEX('Watter:',Col2)+7,CAST(CHARINDEX(', Juice',Col2) AS int)-CAST(CHARINDEX('Watter:',Col2)+7 AS int))
0 голосов
/ 20 ноября 2018

Ваши столбцы так близки к тому, чтобы быть JSON.Если вы используете Oracle 12c и выше, рассмотрите возможность их хранения в формате JSON.См. JSON в Oracle .Но я все же сказал бы, что лучше изменить дизайн таблицы, нормализовав ее, если только это не является абсолютно необходимым для ее хранения.

Если вы действительно используете 12c +, преобразование их в JSON также возможно, используя JSON_VALUE, чтобы получить отдельные элементы для сравнения.

SELECT *
FROM (
     SELECT '{' || column1 || '}' AS column1,
            '{' || column2 || '}' AS column2
     FROM t
)
WHERE 
JSON_VALUE(column1,'$.Watter' ) <> JSON_VALUE(column2,'$.Watter' );

Я не добавилдополнительные проверки.Вы должны обработать NULL s, используя COALESCE или NVL, если в некоторых случаях атрибут Watter не существует.

LiveSQL Demo (Для исполнения требуется бесплатный OTN-аккаунт)

0 голосов
/ 20 ноября 2018
select substr(col1,instr(col1,'Watter:')+7,instr(col1,', Juice:')-instr(col1,', Watter:')-9) as from_col1
       ,substr(col2,instr(col2,'Watter:')+7,instr(col2,', Juice:')-instr(col2,', Watter:')-9) as from_col2
       ,col1
       ,col2
  from t
where substr(col1,instr(col1,'Watter:')+7,instr(col1,', Juice:')-instr(col1,', Watter:')-9)
    <> substr(col2,instr(col2,'Watter:')+7,instr(col2,', Juice:')-instr(col2,', Watter:')-9)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...