在同一张表中,我有两列,每列具有以下格式的字符串:
| column1 | column2
--------------------------------|---------------------------------
| Soda: 10, Watter:5, Juice: 12 | Soda: 7, Watter:20, Juice: 15 |
如何创建仅提取第一列和第二列中水的值不同的行的查询?
答案 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
属性不存在,则必须使用COALESCE
或NVL
处理Watter
。
LiveSQL Demo(执行需要免费的OTN帐户)