【问题标题】:Mix DISTINCT and UPPER keywords together将 DISTINCT 和 UPPER 关键字混合在一起
【发布时间】:2013-03-08 14:46:11
【问题描述】:

我在 Oracle 10 上有这个查询:

SELECT DISTINCT NOME
FROM ICT.UTENTE
WHERE UPPER(nome) LIKE UPPER('MA%');

这行得通,让我得到类似的东西:

MARIA LUISA
Mariano
MARIO

我真正想要的是将每一行都设为大写,但我想不出将DISTINCTUPPER 关键字混合在一起的方法。我试图用以下任何一个替换第一个查询行:

SELECT DISTINCT UPPER(nome)   -- not a SELECTed expression
SELECT UPPER (DISTINCT nome)  -- missing expression
SELECT DISTINCT UPPER nome    -- upper: invalid identifier
SELECT UPPER DISTINCT nome    -- FROM keyword not found where expected

但我总是遇到麻烦!子查询是唯一的解决方案吗?

【问题讨论】:

  • 具体有哪些错误?
  • SELECT DISTINCT UPPER(nome) 应该可以工作......错误是什么?您使用的是哪个 DBMS?
  • 就像 Thomas 提到的 select distinct upper 应该可以工作,我认为你不需要 UPPER 常量值 - UPPER('MA%')
  • 不是一个常量值,而是来自 HTML 表单的东西

标签: sql oracle select distinct uppercase


【解决方案1】:

这应该可行。

SELECT DISTINCT UPPER(nome)   

确实有效。如果您收到此错误...

ORA-01791: not a SELECTed expression

...那么您还没有发布整个查询。具体来说,您没有向我们展示 ORDER BY 子句。对于 DISTINCT,ORDER BY 子句中的属性必须与投影匹配。所以要么你需要......

ORDER BY upper(nome)

...或者您可以作弊并按位置排序...

ORDER BY 1

【讨论】:

  • 是的,为了简洁起见,我隐藏了 order 子句。
【解决方案2】:

如果您的 DBMS 确实不支持 DISTINCT 和 UPPER 的混合(这会很奇怪),您可以尝试使用 GROUP BY 而不是 DISTINCT,如下所示:

SELECT UPPER(NOME)
FROM ICT.UTENTE
WHERE UPPER(nome) LIKE UPPER('MA%')
GROUP BY UPPER(NOME);

如果您的 DBMS 的 LIKE 实现区分大小写,则可能还有一个不区分大小写的运算符变体,称为“ILIKE”,可以在 WHERE 子句中用 UPPER 代替 LIKE:

SELECT UPPER(NOME)
FROM ICT.UTENTE
WHERE nome ILIKE 'MA%'
GROUP BY UPPER(NOME);

这取决于您使用的 DBMS...

【讨论】:

    【解决方案3】:

    试试这个

    SELECT DISTINCT Upper(NOME) as NOME
    FROM ICT.UTENTE
    

    SELECT  Upper(NOME) as NOME
    FROM ICT.UTENTE group by NOME
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 2022-01-03
      • 2013-11-20
      • 2015-02-13
      • 2013-03-22
      相关资源
      最近更新 更多