Запросите, чтобы получить все имена сотрудников, в качестве имени которых в качестве имени выступает средний знак «А». - PullRequest
1 голос
/ 21 июля 2011

Например: - ТОРМОЗ, КРАН и т. Д.

В моей таблице сотрудников у меня есть ENAME,ENO,JOB,SALARY.

Здесь я хочу извлечь те enames, которые имеют 'A' какцентральный символ в их имени.

Если длина ename нечетная, то центральная, поэтому мне нужно определить нечетную и четную позицию в ename.

Итак, я попробовал это, но застрялвверх, так могу ли я ожидать помощи отсюда?

SELECT ENAME
FROM EMPLOYEES
WHERE A IN
(SELECT ENAME,
       SUBSTR(ENAME,LENGTH(ENAME)/2+1,1)
FROM EMPLOYEES)
;

Ответы [ 5 ]

3 голосов
/ 21 июля 2011

Это работает для строк нечетной длины, что, я думаю, то, что вы хотели. В следующий раз, пожалуйста, не используйте такие шапки. Мне понадобилось 5 минут, чтобы прочитать ваш пост.

SELECT `ENAME` FROM  `EMPLOYEES` WHERE SUBSTR(`ENAME`, LENGTH(`ENAME`)/2+1, 1) =  'A'
1 голос
/ 21 июля 2011
SELECT ename
  FROM employees
WHERE
INSTR(
CASE
  WHEN MOD(LENGTH(ename),2) = 0 THEN SUBSTR( ename, LENGTH(ename)/2, 2 )
  ELSE SUBSTR( ename, (1+LENGTH(ename)/2), 1 )
END,
'A'
) > 0
1 голос
/ 21 июля 2011

Сначала проверяется, что в имени есть нечетное количество букв, а затем проверяется.

Вторая часть проверяет средние 2 буквы на четные длины, чтобы узнать, является ли один из них A.

Это синтаксис SQL Server, но я думаю, что Oracle должен быть похожим.

SELECT ENAME
FROM EMPLOYEES
WHERE ((LEN(ENAME) %2) = 1
AND SUBSTRING(ENAME, LEN(Ename)/2+1, 1) = 'A')
OR
((LEN(ENAME) %2) = 0
AND SUBSTRING(ENAME, LEN(ENAME)/2-1, 2) LIKE '%A%')
0 голосов
/ 03 июля 2013

Вы можете даже попробовать это:

select ename from emp where substr(ename,ceil((length(ename))/2),1)='A';

Это будет работать как для строк четной, так и для нечетной длины ... надеюсь, это помогло.

0 голосов
/ 21 июля 2011

Я думаю, это то, что вы имеете в виду:

SELECT ENAME FROM EMPLOYEES where ENAME=SUBSTR(ENAME,LENGTH((ENAME+1)/2),1)

Какой сервис базы данных вы используете? (например, на сервере MS SQL вы должны использовать Len)

...