在过去的某个时候,数据列值(CLOB)从CSV切换到JSON。没有文件说明这是何时发生的。
我不能在select上执行orderby,因为记录可能会被更新,值会被JSON替换。因此,最早的记录可能出现在该日期,但如果我搜索当天的所有记录,我可以看到当天的CSV和JSON数据的混合。
有没有一种方法可以在SQL中找到所有记录都是JSON的那一天,因为这很可能是发生切换的日期?或者搜索CONTENT中的所有数据都是JSON类型的日期范围?
例如DB列和虚拟数据
DATE_CREATED | DATE_UPDATED | CONTENT
01-APR-12 01-APR-12 <XML STUFF>
01-APR-12 01-APR-12 <XML STUFF>
01-APR-12 21-JUN-20 {JSON STUFF}
05-APR-12 05-APR-12 <XML STUFF>
01-APR-14 08-MAR-20 {JSON STUFF}
01-APR-16 21-JUN-21 <XML STUFF>
01-APR-14 11-SEP-22 {JSON STUFF}
01-APR-14 01-JAN-21 {JSON STUFF}
01-APR-17 21-JUN-19 <XML STUFF>
11-FEB-23 11-FEB-20 {JSON STUFF}
11-FEB-23 11-FEB-20 {JSON STUFF}
11-FEB-23 11-FEB-20 {JSON STUFF}
当CONTENT的所有数据都是JSON时,我需要一种方法来查询数据库以找到DATE_CREATED
输出:
DATE_CREATED | DATE_UPDATED | CONTENT
11-FEB-23 11-FEB-20 {JSON STUFF}
11-FEB-23 11-FEB-20 {JSON STUFF}
11-FEB-23 11-FEB-20 {JSON STUFF}
2条答案
按热度按时间lf3rwulv1#
可以使用
IS JSON
操作符:如果不支持,则可以创建一个用户定义函数,通过尝试解析
CONTENT
值并捕获任何异常来检查CONTENT
值是否是有效的JSON:然后用途:
IS JSON
。*其中,对于样本数据:
输出:
| 创建日期|联系我们|
| --------------|--------------|
| 2019 -01- 22 00:00:00|我的天|
| 2019 -01- 14 00:00:00|[“abc”]|
| 2019 -01-05 00:00:00|我的天|
如果你想获取最早的一行,并且这一行和之后创建的所有行都是有效的JSON,那么你可以使用
MATCH_RECOGNIZE
进行模式匹配:其中,输出:
| 创建日期|联系我们|
| --------------|--------------|
| 2019 -01- 14 00:00:00|[“abc”]|
如果你想包含
date_updated
,那么取消日期列的透视,并使用相同的技术。fiddle
更新:
如果你想要第一个日期,在这一整天和以后的所有日子里,
content
都是有效的JSON,那么只需使用上一个查询并检查第一个匹配的行是否在上一行的后面一天:fiddle
mo49yndu2#
问题的文本与提供的样本数据相结合,结果有点令人困惑。示例数据中有一些行在创建之前已更新,但如果您需要:
quote:“I need a way to query the database to find the DATE_CREATED when all data for the CONTENT was JSON”然后你可以使用Not Exists来做选择,尽管结果与你预期的结果有点不同。
注意:表达式SubStr(t.CONTENT,1,1)||SubStr(CONTENT,-1)= '{}'不会测试内容是否正确的JSON-如果您也需要检查,那么您应该使用其他方法,具体取决于您正在使用的Oracle版本。