2011-07-28 4 views
13

私はいくつかのVARCHARパラメータを取り込む関数またはストアドプロシージャを持っていると言います。これらのパラメータは値を持っている場合、私はテストするために、次のようにSQLを書くのに疲れ得ている:SQLのVARCHARのString.IsNullOrEmptyのような機能ですか?

IF @SomeVarcharParm IS NOT NULL AND LEN(@SomeVarcharParm) > 0 
BEGIN 
    -- do stuff 
END 

奨めはこれを行うには良い方法があります。そこにいない?

+0

おっと、私はそれを知っていたはずです。両方の答えが当然働きます。彼が最初に投稿して以来、受け入れられたジョーの答え。 –

+0

デレクの答えに対するコメントを参照してください。 –

答えて

21

あなたはISNULL(@SomeVarcharParam, '') <> ''を行うことができます。また、ビット返すUDFを作成することができます

create function dbo.IsNullOrEmpty(@x varchar(max)) returns bit as 
BEGIN 
IF @SomeVarcharParm IS NOT NULL AND LEN(@SomeVarcharParm) > 0 
    RETURN 0 
ELSE 
    RETURN 1 
END 

をそしてIF NOT dbo.IsNullOrEmpty(@SomeVarcharParam) BEGIN ...

を使用すると、心に留めておくことをことを呼び出すUDFを呼び出すと、あなたはMUSTプレフィックスの所有者(ここではdbo)

+0

'COALESCE'がそれを使用し、' ISNULL() 'をより効率的にするので、' ISNULL() 'をもう少し強調しておくべきでしょう。結果的に、['IsNull'はより高速です。](http://www.bennadel.com/blog/196-SQL-COALESCE-Very-Cool-But-Slower-Than-ISNULL-.htm) –

+0

@Justin Satyr:Adam Machanic 'ISNULL'は' COALESCE'よりも10-12%だけ速いことが明らかになりました(http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/performance-isnull-vs-coalesce.aspx)。彼の言葉では、 "機能と標準の準拠の犠牲を払う価値はほとんどありません。"さらに、Adamが記事の後のコメントで示したように、SQL Server 2008ではその差異は完全になくなり、どちらもほぼ同じパフォーマンスを示しています。 –

+0

@ジョー、私はリクエスタが彼が受け入れた答えを実際に変更することを意味しませんでした...いずれにしても、* COALESCEが 'ISNULL'関数を指しているのであれば、違いがO (1)の場合、 'ISNULL'は' return true'が 'Return FunctionThatReturnsTrue()'よりも優れているのと同じ理由で、依然として優れています。あまり冗長ではありません。あなたの使い方では、 'COALESCE'の複数価値機能は決して必要ありません。しかし、基準に関する正当な懸念があります。 –

7
IF COALESCE(@SomeVarcharParm, '') <> '' 
BEGIN 
    -- do stuff 
END 
3

文字列を連結または結合する場合( select文)、私は列が、私はこれを行う、NULLまたは空であるかどうかを確認したい:

ISNULL('starting to build string ' 
+ NULLIF(some_table..some_col_that_might_be_null_or_empty, '') 
, 'string to append if the resulting concatenation is null') 

それが空の場合は、式の内側の一部にNULLIFはNULLに列を強制されます、そして、外部のISNULL式は一貫した入力に依存し、それに応じて反応することができます。

0

私はこれが古い質問です実現するが、これは私がMSSQLに使用するものです。 LEN(ISNULL(@asdf, ''))>0

例:

DECLARE @asdf varchar(10) 
SET @asdf = NULL --You can change this value to test different outputs 

BEGIN IF LEN(ISNULL(@asdf, '')) > 0 
    PRINT @asdf 
ELSE 
    PRINT 'IS NullOrEmpty' 
END 

--You can use it inline like this: 
PRINT CASE LEN(ISNULL(@asdf, '')) WHEN 0 THEN 'IS NullOrEmpty' ELSE @asdf END 

私はこれがためにまっすぐ進む他のソリューションよりも簡単かつよりだと思います文字列がヌルか長さが0かどうかを文字通りチェックしています。

1

ISNULLを "拡張"して空もチェックする機能です。テスト値がヌルであるかどうかがチェックされ、ヌルでない場合は、トリムされて長さがチェックされます。

この関数は、NOT NullまたはEmptyの場合はテスト文字列を返し、そうでない場合は2番目の文字列を返します。

CREATE FUNCTION [dbo].[ISNULLOREMPTY] 
( 
    @value NVARCHAR(max), 
    @return NVARCHAR(max) 
) 
RETURNS NVARCHAR(MAX) 
AS 
BEGIN 

IF (@value IS NULL) 
BEGIN 
    RETURN @return 
END 
ELSE 
BEGIN 
    IF (LEN(LTRIM(@value)) = 0) 
    BEGIN 
     RETURN @return 
    END 
END 

RETURN @value; 
END 
GO 
0

LENを呼び出す前にnullを確認する必要はありません。 LEN(@SomeVarcharParm)> 0を使用することができます。値がNULL、 ''、または ''の場合、falseを返します。これは、NULL> 0がfalseを返すためです。実行し、自分自身を参照してください:

SELECT 
CASE WHEN NULL > 0 THEN 'NULL > 0 = true' ELSE 'NULL > 0 = false' END, 
CASE WHEN LEN(NULL) > 0 THEN 'LEN(NULL) = true' ELSE 'LEN(NULL) = false' END, 
CASE WHEN LEN('') > 0 THEN 'LEN('''') > 0 = true' ELSE 'LEN('''') > 0 = false' END, 
CASE WHEN LEN(' ') > 0 THEN 'LEN('' '') > 0 = true' ELSE 'LEN('' '') > 0 = false' END, 
CASE WHEN LEN(' test ') > 0 THEN 'LEN('' test '') > 0 = true' ELSE 'LEN('' test '') > 0 = false' END 
0

条件はNULLに評価され、パラメータが、彼は技術的に実現しても、私はアトロンの答えをupvoted

0

nullの場合、分岐が取られることはありませんので、あなたはIF @SomeVarcharParam <> ''を単に行うことができますIfNullOrWhiteSpace

ここIfNullOrEmpty()の私の実装です:

IF EXISTS (SELECT * FROM sys .objects WHERE object_id = OBJECT_ID(N'[dbo].[IfNullOrEmpty]') and type in (N'FN')) 
    DROP FUNCTION dbo.IfNullOrEmpty 
go 

CREATE FUNCTION dbo.IfNullOrEmpty(@value varchar(max), @substitute varchar(max)) returns varchar(max) as 
BEGIN 
    IF @value IS NOT NULL AND LEN(@value) > 0 
     RETURN @value 
    RETURN @substitute 
END 
0

使用(デレクさんに基づいて)この機能:

dbo.isNullOrEmpty(@someVar) 

または

WHERE dbo.isNullOrEmpty(@someVar) = 1 
として

CREATE FUNCTION dbo.isNullOrEmpty(@x varchar(max)) RETURNS BIT AS 
BEGIN 
    IF @x IS NOT NULL AND LEN(@x) > 0 
     RETURN 0 

    RETURN 1 
END 

ストアドプロシージャまたはクエリの

関連する問題