[解決済み] SQL Server 2008 空文字列とスペースの比較
質問
今朝、ちょっと変なことに遭遇したので、解説のために投稿してみようと思います。
次の SQL クエリを SQL 2008 に対して実行すると、なぜ 'equal' と表示されるのか、どなたか説明していただけませんか。 db 互換性レベルは 100 に設定されています。
if '' = ' '
print 'equal'
else
print 'not equal'
そして、これは0を返します。
select (LEN(' '))
スペースが自動的に切り取られているように見えます。 SQL Server の以前のバージョンではそうだったのかどうか見当もつきませんし、それをテストするためのものさえもう手元にありません。
私は、本番用クエリが不正な結果を返していたため、これに遭遇しました。 この動作はどこにも文書化されていません。
どなたかこれに関する情報をお持ちではないでしょうか。
どのように解決するのですか?
varchar
と等号は、TSQLでは茨の道です。その
LEN
関数は言う。
与えられた文字列式のバイト数ではなく、文字数を返します。 末尾の空白を除く .
を使用する必要があります。
DATALENGTH
を使うことで、真の
byte
のカウントを取得します。unicodeのデータを持っている場合、この状況で得られる値はテキストの長さと同じではないことに注意してください。
print(DATALENGTH(' ')) --1
print(LEN(' ')) --0
式の等価性に関しては、このように2つの文字列を比較して、等価性を判断します。
- より短い文字列を取得
- 空白で埋める 長い文字列と同じ長さになるまで
- 2つの文字列を比較します。
このステップの後では、事実上、空白と空白を比較しているため、両者は等しいと見なされるのです。
LIKE
よりも良い動作をします。
=
よりも良い振る舞いをします。これは、マッチしようとしたパターンに対して空白のパディングを行わないからです。
if '' = ' '
print 'eq'
else
print 'ne'
を与える
eq
を与える。
if '' LIKE ' '
print 'eq'
else
print 'ne'
を与える
ne
注意深く
LIKE
は対称的ではありません。パターン(RHS)では末尾の空白を重要なものとして扱いますが、マッチ式(LHS)ではそうではありません。以下は
ここで
:
declare @Space nvarchar(10)
declare @Space2 nvarchar(10)
set @Space = ''
set @Space2 = ' '
if @Space like @Space2
print '@Space Like @Space2'
else
print '@Space Not Like @Space2'
if @Space2 like @Space
print '@Space2 Like @Space'
else
print '@Space2 Not Like @Space'
@Space Not Like @Space2
@Space2 Like @Space
関連
-
[解決済み] パーセント値を保持するための適切なデータ型?
-
[解決済み] ')' 付近の構文が正しくない場合の対処方法
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] SQL Server テーブルにカラムが存在するかどうかを確認する方法は?
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] SQL ServerにおけるLEFT JOINとLEFT OUTER JOINの比較
-
[解決済み] SQL Server にテーブルが存在するかどうかを確認する
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
-
[解決済み] SQL ServerでINNER JOINを使用して削除するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】フラットファイルの日付カラムで「キャスト指定に無効な文字値があります」を修正する方法とは?
-
[解決済み] データベース 'tempdb' で CREATE TABLE 権限が拒否されました。
-
[解決済み] TABLOCKとTABLOCKXの比較
-
[解決済み] sp_columnsが結果を返さないのはなぜですか?
-
[解決済み] オペランドタイプの衝突
-
[解決済み] SQL ServerのIsNull()関数に相当するOracleは何ですか?
-
[解決済み] SQL Serverのタイムスタンプ列をdatetime形式に変換する方法
-
[解決済み] SQLのReplace関数内の正規表現?
-
[解決済み] SQL Server : varchar を INT に変換する。
-
[解決済み] SQL Server Management StudioでIntelliSenseが機能しない