簡體   English   中英

Presto SQL列中存儲的JSON如何使用WHERE語句進行過濾?

[英]How to use WHERE statement on JSON stored in Presto SQL column to filter?

在 Presto 中,我有表中一列的數據如下:

header header 2
{數據:[{'item1':'stuff1','item2':'stuff2','item3':'stuff3'},{...}]} 單元格 2
{數據:[{'item1':'stuff11','item2':'stuff21','item3':'stuff31'},{...}]} 單元格 4

我能夠使用 JSON 語法使用 SELECT:

SELECT header.Data[1].item1 FROM table

並返回:

header
東西1
東西11

但是,如果我想使用 WHERE 語句過濾表:

SELECT * FROM table WHERE header.Data[1].item1 = 'stuff1'

上面的語句拋出了一個錯誤並且不起作用。

我想返回類似的東西

header header 2
{數據:[{'item1':'stuff1','item2':'stuff2','item3':'stuff3'},{...}]} 單元格 2

任何輸入都會有所幫助。 謝謝

我也使用 SQL 嘗試了其他幾個查詢,但都返回了類似的錯誤:

WHERE header.Data[1].item1 = 'stuff1'

錯誤示例:

詢問:

`SELECT header.Data[1].item1 AS f FROM table WHERE f LIKE '%stuff%' 

''' 調用 o12.execute 時出錯。 : java.sql.SQLException: Query failed (#20220330_200148_01673_9bq5k): line 2:7: Column 'f' cannot be resolved at io.prestosql.jdbc.AbstractPrestoResultSet.resultsException(AbstractPrestoResultSet.java:1761) at io.prestosql.jdbc.PrestoResultSet. getColumns(PrestoResultSet.java:252) at io.prestosql.jdbc.PrestoResultSet.create(PrestoResultSet.java:54) at io.prestosql.jdbc.PrestoStatement.internalExecute(PrestoStatement.java:249) at io.prestosql.jdbc.PrestoStatement .execute(PrestoStatement.java:227) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43 ) 在 java.lang.reflect.Method.invoke(Method.java:498)在py4j.reflection.methodinvoker.invoke(MethodInvoker.java:231)上,py4j.reflection.reflection.reflection.invoke.invoke(reflectionEngine.java888881),py4j.gate.gate.gateway.gateway.gateway.gateway.gate.gate.gate.gate.gate.gate.gate.gate.gate.gate.gate.gate.gate.gate.gate.gate.goke一下invokeMethod(AbstractCommand.java:133) at py4j.commands.CallCommand.execute(CallCommand.java:79) at py4j.GatewayConnection.run(GatewayConnection.java:209) at java.lang.Thread.run(Thread.java:750 ) Caused by: io.prestosql.spi.PrestoException: line 2:7: Column 'f' cannot be resolved at io.prestosql.sql.analyzer.SemanticExceptions.semanticException(SemanticExceptions.java:48) at io.prestosql.sql. analyzer.SemanticExceptions.semanticException(SemanticExceptions.java:43) 在 io.prestosql.sql.analyzer.SemanticExceptions.missingAttributeException(SemanticExceptions.java:33) 在 8868686883835sqlto.6858384 26236788.analyzer.Scope.lambda$resolveField$7(Scope.java:228) at java.base/java.util.Optional.orElseThrow(Optional.java:408) at io.prestosql.sql.analyzer.Scope.resolveField(Scope .java:228) at io.prestosql.sql.analyzer.ExpressionAnalyzer$Visitor.visitIdentifier(ExpressionAnalyzer.java:438) at io.prestosql.sql.analyzer.ExpressionAnalyzer$Visitor.visitIdentifier(ExpressionAnalyzer.java:342) at io. prestosql.sql.tree.Identifier.accept(Identifier.java:72) at io.prestosql.sql.tree.StackableAstVisitor.process(StackableAstVisitor.java:27) at io.prestosql.sql.analyzer.ExpressionAnalyzer$Visitor.process( ExpressionAnalyzer.java:365) 在 io.prestosql.sql.analyzer.ExpressionAnalyzer$Visitor.visitLikePredicate(ExpressionAnalyzer.java: 702) at io.prestosql.sql.analyzer.ExpressionAnalyzer$Visitor.visitLikePredicate(ExpressionAnalyzer.java:342) at io.prestosql.sql.tree.LikePredicate.accept(LikePredicate.java:76) at io.prestosql.sql.tree .StackableAstVisitor.process(StackableAstVisitor.java:27) at io.prestosql.sql.analyzer.ExpressionAnalyzer$Visitor.process(ExpressionAnalyzer.java:365) at io.prestosql.sql.analyzer.ExpressionAnalyzer.analyze(ExpressionAnalyzer.java:303 ) at io.prestosql.sql.analyzer.ExpressionAnalyzer.analyzeExpression(ExpressionAnalyzer.java:1691) at io.prestosql.sql.analyzer.StatementAnalyzer$Visitor.analyzeExpression(StatementAnalyzer.java:2606) at io.prestosql.sql.analyzer. StatementAnalyzer$Visitor.analyzeWhere(StatementAnalyzer.java:2465) 在 88686538 45688.prestosql.sql.analyzer.StatementAnalyzer$Visitor.lambda$visitQuerySpecification$23(StatementAnalyzer.java:1528) at java.base/java.util.Optional.ifPresent(Optional.java:183) at io.prestosql.sql.analyzer .StatementAnalyzer$Visitor.visitQuerySpecification(StatementAnalyzer.java:1528) at io.prestosql.sql.analyzer.StatementAnalyzer$Visitor.visitQuerySpecification(StatementAnalyzer.java:322) at io.prestosql.sql.tree.QuerySpecification.accept(QuerySpecification.java :144) at io.prestosql.sql.tree.AstVisitor.process(AstVisitor.java:27) at io.prestosql.sql.analyzer.StatementAnalyzer$Visitor.process(StatementAnalyzer.java:339) at io.prestosql.sql. analyzer.StatementAnalyzer$Visitor.process(StatementAnalyzer.java:349) 在 io.prestosql.sql.analy zer.StatementAnalyzer$Visitor.visitQuery(StatementAnalyzer.java:1039) at io.prestosql.sql.analyzer.StatementAnalyzer$Visitor.visitQuery(StatementAnalyzer.java:322) at io.prestosql.sql.tree.Query.accept(Query. java:107) at io.prestosql.sql.tree.AstVisitor.process(AstVisitor.java:27) at io.prestosql.sql.analyzer.StatementAnalyzer$Visitor.process(StatementAnalyzer.java:339) at io.prestosql.sql .analyzer.StatementAnalyzer.analyze(StatementAnalyzer.java:308) at io.prestosql.sql.analyzer.Analyzer.analyze(Analyzer.java:83) at io.prestosql.sql.analyzer.Analyzer.analyze(Analyzer.java:75 ) 在 io.prestosql.execution.SqlQueryExecution.analyze(SqlQueryExecution.java:256) 在 io.prestosql.execution.SqlQueryExecution.(SqlQueryExecution.8821324) 6945888:182) at io.prestosql.execution.SqlQueryExecution$SqlQueryExecutionFactory.createQueryExecution(SqlQueryExecution.java:757) at io.prestosql.dispatcher.LocalDispatchQueryFactory.lambda$createDispatchQuery$0(LocalDispatchQueryFactory.java:123) at io.prestosql.$gen .Presto_343____20220330_135137_2.call(Unknown Source) at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:125) at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java: 69) at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:78) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java .util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.882132469458 88:628) 在 java.base/java.lang.Thread.run(Thread.java:829) '''

SELECT header.Data[1].item1 AS f引入的別名fWHERE中不可用,因此您需要使用整個表達式:

where header.Data[1].item1 LIKE '%stuff%'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM