PostgreSQL 13.0中查询Chris开头演员及姓氏的SQL排错与实现
修正SQL语法错误并实现演员列表需求
需求说明
- 按字母顺序列出名字以Chris开头的电影演员
- 按升序列出这些演员的姓氏
原错误SQL及报错信息
错误SQL代码
SELECT nome_estrela FROM ESTRELAS WHERE nome_estrela IN (SELECT split_part('', 'nome_estrelas', 00.) FROM ESTRELAS ORDER BY nome_estrela ASC WHERE nome_estrela ( SELECT split_part('nome_estrela', ' ', 00.) FROM ESTRELAS WHERE nome_estrela LIKE 'Chris%' ) );
报错详情(翻译后)
/usr/local/bundle/gems/sequel-5.47.0/lib/sequel/adapters/postgres.rb:156:in `exec': PG::SyntaxError: ERROR: 语法错误位于或接近"WHERE" LINE 13: WHERE nome_estrela ( SELECT split_part... ^ (Sequel::DatabaseError)
错误原因分析
- 子查询语法顺序错误:
ORDER BY被错误放置在WHERE之前,SQL子句的正确顺序应为FROM→WHERE→ORDER BY split_part函数参数错误:该函数标准格式为split_part(目标字符串, 分隔符, 索引位置),原SQL中参数顺序、目标字符串及索引值(使用无效的00.)均不符合要求- 条件表达式无效:
nome_estrela (SELECT ...)缺少必要的比较运算符(如IN、=),不符合SQL语法规范 - 嵌套子查询逻辑冗余:多层嵌套完全不必要,逻辑混乱直接引发语法错误
修正后的SQL实现
1. 列出所有名字以Chris开头的演员(按字母顺序)
SELECT nome_estrela FROM ESTRELAS WHERE nome_estrela LIKE 'Chris%' ORDER BY nome_estrela ASC;
2. 列出这些演员的姓氏(按升序,去重)
SELECT DISTINCT split_part(nome_estrela, ' ', 2) AS sobrenome FROM ESTRELAS WHERE nome_estrela LIKE 'Chris%' ORDER BY sobrenome ASC;
说明:假设姓名格式为「名 姓」,
split_part(nome_estrela, ' ', 2)用于提取姓氏;使用DISTINCT避免重复姓氏出现。
内容的提问来源于stack exchange,提问作者dogo
相关产品推荐
相关产品推荐

