これは醜い回避策ですが、おそらく次のようなことを行うことができます。
DECLARE @x TABLE(StringField VARCHAR(32));
INSERT @x SELECT 'ABC'
UNION ALL SELECT 'A'
UNION ALL SELECT 'AAAAAAAABC';
SELECT SUBSTRING(StringField, 5, CHARINDEX('ABC', StringField) - 5)
FROM @x
WHERE CHARINDEX('ABC', StringField) > 5;
SELECT SUBSTRING(StringField,
CASE WHEN CHARINDEX('ABC', StringField) > 5 THEN 5 ELSE 1 END,
CHARINDEX('ABC', StringField) -
CASE WHEN CHARINDEX('ABC', StringField) > 5 THEN 5 ELSE 0 END)
FROM @x
WHERE CHARINDEX('ABC', StringField) > 5;
両方の収量:
---
AAA
しかし、私は後者があなたの見解で許可されると思います。醜いですが、残念ながら、最初にフィルタリングされたデータを#tempテーブルにダンプしない限り(またはMAXDOP
問題が確実に削除されるかどうかを確認しようとしない限り)、処理の順序をあまり制御できません。
もう1つのアイデアは、計算列をテーブルに配置することです(ただし、インデックス付きビューを作成しようとしている場合に役立つかどうかはわかりませんが、まだ問題がある可能性があります)。または、インデックス付きビューの代わりに、その式でフィルター処理されたインデックスを使用します。インデックス付きビューの目的と使用しているSQLServerのバージョンがわかっている場合は、いくつかの「解決策」が存在する可能性があります。