2つのフィールドが同じかどうかをCASEステートメントで知りたいです。
私は次のクエリでそれを行うことができましたが、より良いアプローチがあるのだろうか?'='で大文字と小文字を区別して比較したいだけです。COLLATEを試してみましたが、結果をフィルタリングするWHERE句を使用する必要があります。すべての行が必要です。そして、HASHBYTESでは、特にISNULLと組み合わせる必要がある場合はやり過ぎのようです。
DECLARE @myTable AS TABLE (old varchar(255), new varchar(255));
INSERT INTO @myTable VALUES
('test', 'test'),
('test', 'TEST'),
(null, null)
SELECT old, new,
CASE WHEN HASHBYTES('SHA2_512', old) = HASHBYTES('SHA2_512', new) THEN 'same' ELSE 'changed' END AS updated,
CASE WHEN HASHBYTES('SHA2_512', ISNULL(old, '')) = HASHBYTES('SHA2_512', ISNULL(new, '')) THEN 'same' ELSE 'changed' END AS updated_isnull
FROM @myTable
--where old = new COLLATE Latin1_General_CS_AS
列 'updated_isnull'が必要です
| old | new | updated | updated_isnull |
| ---- | ---- | ------- | -------------- |
| test | test | same | same |
| test | TEST | changed | changed |
| NULL | NULL | changed | same |
適切な解決策は、データが大文字と小文字を区別する照合に格納されるように列を修正することです。次に、あなたはただするでしょう:
select old, new,
case when old = new
or (old is null and new is null)
then 1
else 0
end as is_same
from @mytable
大文字と小文字を区別しない照合を使用すると、次のように回避できます。
select old, new,
case when old collate Latin1_General_Bin = new collate Latin1_General_Bin
or (old is null and new is null)
then 1
else 0
end as is_same
from @mytable
古い| 新規| is_same :--- | :--- | ------: テスト| テスト| 1 テスト| テスト| 0 null | null | 1
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加