2

ストアドプロシージャがあり、*を許可したいので、次のようになります。

  • t *と入力すると背が高くなり、お茶が戻ります
  • タイプ*またはその後、すべての結果が返されます
  • tと入力すると、tを持つすべての結果がptv、tall、sitのように返されます。

私のストアドプロシージャは次のとおりです。

ALTER PROCEDURE [dbo].[SearchEntityDataNew]
    @SearchText varchar(100) = '*'

AS
BEGIN
    SELECT 'Entity' as pagetype,EntityID,EntityData,EntityDataID 
    FROM EntityData 
    WHERE  EntityData LIKE '%' + @SearchText+ '%'
    OR @SearchText = '*'

    union all

    SELECT 'Property' as pagetype,PropertyID,PropertyValue,EntityDataID  
    FROM EntityDataProperty 
    WHERE  PropertyValue LIKE '%' + @SearchText+ '%'
    OR @SearchText = '*'
END
4

1 に答える 1

3

使用できませんでした:

WHERE  PropertyValue LIKE REPLACE(@SearchText, '*', '%');

次のテスト:

-- SAMPLE TABLE
DECLARE @T TABLE (A VARCHAR(100));
INSERT @T VALUES ('tea'), ('test'), ('foo'), ('bar'), ('foobar');

-- TEST USING WILDCARD AT END
DECLARE @SearchText VARCHAR(100) = 't*';
SELECT  *
FROM    @T
WHERE   A LIKE REPLACE(@SearchText, '*', '%');

-- TEST USING ONLY WILD CARD
SET @SearchText = '*';
SELECT  *
FROM    @T
WHERE   A LIKE REPLACE(@SearchText, '*', '%');

--TEST USING WILD CARD AT START
SET @SearchText = '*bar';
SELECT  *
FROM    @T
WHERE   A LIKE REPLACE(@SearchText, '*', '%');

--TEST USING WILD CARD AT START AND END
SET @SearchText = '*a*';
SELECT  *
FROM    @T
WHERE   A LIKE REPLACE(@SearchText, '*', '%');

出力:

-- Wild card at end: "t*"
tea
test

-- Wild card only: "*"
tea
test
foo
bar
foobar

-- Wild card at start: "*bar"
bar
foobar

-- wild card at start and end: "*a*"
tea
bar
foobar

編集

私はちょうどあなたの質問を読み直しました.ワイルドカード文字が存在しない場合、開始と終了の両方でワイルドカードを想定するという要件を見ました。その場合、これを手順の開始に追加できます:

IF CHARINDEX('*', @SearchText) = 0
    SET @SearchText = '%' + @SearchText + '%'
ELSE
    SET @SearchText = REPLACE(@SearchText, '*', '%')

次に、単に使用します

WHERE  PropertyValue LIKE @SearchText
于 2012-11-07T14:21:02.387 に答える