2013-05-30 2 views
1

В настоящее время я пытаюсь преобразовать этот запрос из Access в правильный SQL. Левые и средние функции в заявлении меня смущают.Convert Access Left & Mid to SQL

SELECT 
name, 
entnum 

IIf(Left(Mid([entnum],4,3),1)=0,Mid([entnum],5,2),Mid([entnum],4,3)) as AGENCYCODE 

FROM CUSTFILE 

типа поле entnum является varchar 15

Любая помощь в попытке понять это было бы весьма признателен.

+1

Какой вкус SQL это? Transact-SQL или что-то еще? – JasonFruit

+0

Просто стандартная версия SQL, которая поставляется с ssms для 2008 R2. – Trelmoz

+0

Для дальнейшего использования это называется Transact-SQL. – JasonFruit

ответ

3

Вы можете использовать SUBSTRING для MID и LEFT. Условные инструкции IIF существуют в некоторых диалектах SQL, но вы можете быть более безопасными с инструкцией CASE.

Глядя на ваше заявление, я думаю, что это может быть сведена к следующему:

SELECT 
    name, 
    entnum, 
    CASE 
     WHEN SUBSTRING(entnum,4,1) = '0' THEN SUBSTRING(entnum,5,2) 
     ELSE SUBSTRING(entnum,4,3) 
    END agencycode 
FROM CUSTFILE 
+1

Некоторые незначительные опечатки - вам не хватает запятой после 'entnum', и вы получили псевдоним' agencycode' внутри оператора 'CASE', когда он должен появиться после' END'. – Yuck

+1

@Yuck - большое спасибо - отредактировал сообщение. – sgeddes

+0

Это именно то, что я искал. Спасибо! – Trelmoz

2

Попробуйте вместо этого:

SELECT 
    name, 
    entnum, 
    CASE 
    WHEN LEFT(SUBSTRING([entnum], 4, 3), 1) = '0' 
     THEN SUBSTRING([entnum], 5, 2) 
    ELSE SUBSTRING([entnum], 4, 3) 
    END as AGENCYCODE 
FROM CUSTFILE 

SUBSTRING используется точно так, как MID. В инструкции CASE вы можете указать несколько условий WHEN..THEN, а также ELSE.

+1

LEFT (SUBSTRING (entnum, 4, 3), 1) - это не то же самое, что и SUBSTRING (entnum, 4,1)? – sgeddes

+1

@sgeddes Это, но чтобы избежать дальнейшего усложнения перевода с MS Access на SQL-код, я оставил как можно больше неповрежденным. – Yuck

+0

+1 btw - ваш ответ работает довольно хорошо. – sgeddes