2016-12-07 3 views
1

У меня есть следующий SQL:Путь не повторять выражения в запросе манипуляции строка SQL Server

SUBSTRING(Location, 
      CHARINDEX(' : ', Location) + 3, 
      CHARINDEX(' ms - ', Location) - (CHARINDEX(' : ', Location) + 3)) 

(Адрес может быть что-то вроде этого: 1dasev : 232 ms - 323-asv3R и substring вернется 232)

Если Я написал это в C#, я бы не пересчитывал CHARINDEX(' : ', Location) + 3 дважды. Я бы сохранил его в переменной, а затем повторно использовал.

Есть ли какой-нибудь классный трюк в SQL для всех меня, чтобы сделать аналогичную вещь? (Мой запрос будет более сложным, чем простой пример выше, и я надеюсь, чтобы сделать его более читаемым.)

+0

- это строковый формат, согласованный? –

+0

вам нужно будет ввести дополнительный запрос или общее табличное выражение, отличное от этого, так как обычно это делается путем повторения формул. – Matt

ответ

1

трюк использовать CROSS APPLY для его расчета

SELECT 
SUBSTRING(Location, 
      c, 
      CHARINDEX(' ms - ', Location) - c) 
FROM YOURTABLE 
     CROSS APPLY 
     (
     SELECT c = CHARINDEX(' : ', Location) + 3 
    ) c 
+0

Отлично! Спасибо. – Vaccano

1

Вы можете использовать подзапрос, чтобы определить ваше общее выражение:

SELECT SUBSTRING(Location, x.AfterColon, CHARINDEX(' ms - ', Location) - x.AfterColon) 
FROM (
    SELECT *, (CHARINDEX(' : ', Location) + 3) AS AfterColon 
    FROM ... 
) x