Oracle SQL Group BY через столбец substr - PullRequest
0 голосов
/ 16 апреля 2020
SELECT SUBSTR(PRODID,1, 4) AS [PROD4], COUNT(*) AS [NumberOfRows] 
FROM [sch].[ProdTable] 
GROUP BY SUBSTR(PRODID,1, 4)

Мы пишем простой выбор, который бы подсчитывал, сколько из наших продуктов имеют одинаковые первые 4 символа. Наши идентификаторы продукта состоят из 10 цифр / символов.

Однако при этом мы получаем:

SQL Ошибка [936] [42000]: ORA-00936: отсутствует выражение

Есть идеи, как заставить это работать?

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Просто немного поподробнее ответ @ GMB.

[sch]. [ProdTable]

В Oracle это неправильный синтаксис для ссылки на объект. Не заключайте их в [] квадратных скобок:

FROM sch.ProdTable 

Однако, если вы действительно хотите использовать квадратные скобки для именования ваших объектов (, что было бы очень уродливо ), вы могли бы используйте цитируемый идентификатор . Он начинается и заканчивается двойными кавычками ". Это также делает чувствительным к регистру и всегда должно использоваться с двойными кавычками, когда вы ссылаетесь на этот объект.

create table "[t]" as select 'hi' as "[str]" from dual;
select * from "[t]";

[str]
-----
hi

В вашем SQL, если ваша таблица не создана, что Кстати, тебе это не нужно. Вы все еще можете назвать псевдоним вашего столбца в квадратных скобках, используя кавычки:

select 'hi' as "[str]" from dual;

[str]
-----
hi
1 голос
/ 16 апреля 2020

Проблема с квадратными скобками. Oracle не поддерживает этот синтаксис. Эти идентификаторы, вероятно, в любом случае не требуют кавычек, поэтому:

SELECT SUBSTR(PRODID,1, 4) PROD4, COUNT(*) NumberOfRows
FROM sch.ProdTable 
GROUP BY SUBSTR(PRODID,1, 4)

Если вам действительно нужно заключить в кавычки идентификаторы (скажем, если имя таблицы было создано как регистрозависимое имя, или вы хотите смешанный псевдонимы столбцов), то вы можете использовать двойные кавычки:

SELECT SUBSTR(PRODID,1, 4) PROD4, COUNT(*) "NumberOfRows"
FROM sch."ProdTable"
GROUP BY SUBSTR(PRODID,1, 4)
...