如何在两列之间比较字符串的一部分

时间:2018-11-20 15:44:14

标签: sql oracle

在同一张表中,我有两列,每列具有以下格式的字符串:

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

如何创建仅提取第一列和第二列中水的值不同的行的查询?

3 个答案:

答案 0 :(得分:0)

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)

答案 1 :(得分:0)

尝试这种方式:

-- 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))

答案 2 :(得分:0)

您的列非常接近JSON。如果您使用的是Oracle 12c及更高版本,请考虑将它们存储为JSON。参见JSON in Oracle。但是,我仍然会说,最好通过规范化表来重新设计表,除非绝对有必要以这种方式存储表。

如果您确实使用12c +,也可以使用JSON_VALUE将它们转换为JSON,以获取各个元素进行比较。

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

我还没有添加额外的验证。如果在某些情况下NULL属性不存在,则必须使用COALESCENVL处理Watter

LiveSQL Demo(执行需要免费的OTN帐户)