web-dev-qa-db-ja.com

where句でブール値を返すSQLユーザー定義関数を実行する

これが簡単すぎるようには思えません。私はこれを調べましたが、SQLのユーザー定義関数とその使用があまり得意ではないので、何が起こっているのかわかりません。エラーが発生する理由を教えてくれると思う人はいますか?

')'の近くの、条件が予想されるコンテキストで指定された非ブール型の式。

このため:

UPDATE LMI_Contact
SET Phone = NULL
WHERE dbo.LMI_IsSingleCharacterRepeated(Phone, '0')

ここで、関数は次を使用して作成できます。

-- ***this will also find NULL and empty string values***
CREATE FUNCTION LMI_IsSingleCharacterRepeated (@string varchar(max), @char char(1))
RETURNS bit
AS 
BEGIN
    DECLARE @index int
    DECLARE @len int
    DECLARE @currentChar char(1)
    SET @index = 1
    SET @len= LEN(@string)

    WHILE @index <= @len
    BEGIN
        SET @currentChar = SUBSTRING(@string, @index, 1)
        IF @currentChar = @char
            SET @index= @index+ 1
        ELSE
            RETURN 0
    END
    RETURN 1
END;
GO

この関数は、文字列が指定された単一の文字であるかどうかを繰り返し確認するためのものです。誰かがそれが便利だと思うことを願っています!

20
Chris Halcrow

戻り値の型がbitであっても、関数に対して比較演算子を使用する必要があります。

UPDATE LMI_Contact
SET Phone = NULL
WHERE dbo.LMI_IsSingleCharacterRepeated(Phone, '0') = 1
22
Thomas

クエリのwhere句を次のように変更する必要があります。

UPDATE LMI_Contact
SET Phone = NULL
WHERE dbo.LMI_IsSingleCharacterRepeated(Phone, '0') = 1
4
nikhil pinto

これを試して

CREATE FUNCTION LMI_IsSingleCharacterRepeated (@str varchar(max), @char char(1))
RETURNS BIT
AS 
BEGIN
    DECLARE @indx int
    DECLARE @len int
    DECLARE @currentChar char(1)
    SET @indx = 1
    SET @len= LEN(@str)

    WHILE @indx <= @len
    BEGIN
        SET @currentChar = SUBSTRING(@str, @indx, 1)
        IF @currentChar = @char
            SET @indx= @indx+ 1
        ELSE
            RETURN 0
    END
    RETURN 1
END;
GO
4
Ravi