3

免責事項:私はまだSQLを学んでいるので、私の質問がアマチュアっぽいものであるか、そうでなければ非常に単純な答えである場合は、お詫び申し上げます。正式なトレーニングはありません。私は自分自身を教えています。ありがとう。

EMAIL列が空白の場合に、EMAIL列をEMAIL2列のデータで更新するために、特定のクエリが作成されました。このクエリは、EMAIL列にデータを入力するために以前の列も空白になっている場合に、EMAIL3-6列からデータを取得します。現在、次のようになっています。

update Parents set email = email2 where email = ' ' OR email is null go

update Parents set email = email3 where email = ' ' OR email is null go

update Parents set email = email6 where email = ' ' OR email is null go

(等々)

ある種のIF...THENタイプの条件を使用して、EMAIL列の空白またはnullをチェックし、2番目の列のデータに基づいてデータを入力する、より簡単な方法はありますか?これらの列は、空白またはnull値がないかチェックし、空白またはnullがtrueの場合はスキップする必要があります。

アドバイスをいただければ幸いです。上記のクエリは機能しますが、それを実行するための最良の方法とは思えません。

4

3 に答える 3

3

このような意味ですか?

update Parents 
      set email = COALESCE(
                    NULLIF(LTRIM(RTRIM(email2), '')),
                    NULLIF(LTRIM(RTRIM(email3), '')),
                    NULLIF(LTRIM(RTRIM(email4), '')),
                    NULLIF(LTRIM(RTRIM(email5), '')),
                    NULLIF(LTRIM(RTRIM(email6), ''))
                  ) 
where email = ' ' OR email is null

The

LTRIM(RTRIM(email2)

SQL Serverにはトリムがないため、''は空の文字列''に変換されますが、2つの別個の関数LTRIMRTRIM。2つの式が等しい場合、NULLIFはnullを返します。したがって、電子メール列のいずれかがnullまたは単に''の場合、nullを返します。

このCOALESCE関数は、ではない最初の式の値を返しますnull

于 2013-01-08T15:48:24.050 に答える
3

知り合いになりたい便利な関数はNULLIFです。値をNULLのように扱いたい場合に、ロジックを単純化することができます。たとえば、アプリケーションが「NA」の番兵値をNULL可能列に入れていたcolumn1場合NULLIF(column1, 'NA')、すべてのNULLとすべてのNAに対してNULL値を返します。あなたの場合、このトリックを使用して空の文字列をNULLに変換します。

もう1つ行うことは、すべての空の文字列をトリミングして、NULLIFが(''、''、''、ad nauseumの代わりに)''のシナリオのみをチェックする必要があるようにすることです。TSQLはLTRIMとRTRIMRTRIMのみを提供し、どちらの方向からも空の文字列をトリミングすると目的の状態になりますが、私は使用する習慣があります。NULLIF(RTRIM(column1),'')

その式を使用して、 COALESCE関数にプラグインする正しいものができました。したがって

UPDATE
    P
SET
    email = COALESCE(NULLIF(RTRIM(P.email2), ''), NULLIF(RTRIM(P.email3), ''), NULLIF(RTRIM(P.email4), ''))
FROM
    dbo.Parents P
WHERE
    -- This will force a table scan which can be a bad thing for performance
    -- Generally, one should avoid wrapping functions around a column and instead
    -- apply them to the thing being tested
    NULLIF(RTRIM(P.email), '') IS NULL
于 2013-01-08T16:06:53.363 に答える
1

これをCOALESCEとNULLIFのチュートリアルにするのではなく、@ billinkcが彼の回答で提供したすべてを証明するために、これが機能する理由です。(申し訳ありませんが、彼が答えたときに私は解決策に取り組んでいました)。これをSSMSに挿入して、結果を確認してください。ただし、上記のような単純な更新でうまくいきます。

SQLフィドルリソースを発見したばかり: SQLフィドル

--Setup the temp table
DECLARE @Parents TABLE (
    ParentsId INT IDENTITY (1,1) PRIMARY KEY,
    email varchar(max),
    email2 varchar(max),
    email3 varchar(max),
    email4 varchar(max),
    email5 varchar(max),
    email6 varchar(max)
)

--This would be the pull from your real Parents Table.
INSERT INTO @Parents 
SELECT
    NULL,'test@domain.com',' ',NULL,NULL,NULL
UNION ALL
SELECT
    NULL,'   ',NULL,NULL,NULL,'test2@domain.com'
UNION ALL
SELECT
    NULL,'',NULL,NULL,NULL,'test3@domain.com'

--Look at the data before we cleanse it
SELECT * FROM @Parents

--Take a look at what COALESCE looks like before the cleanse
SELECT ParentsId, COALESCE(email2,email3,email4,email5,email6) AS NewEmail FROM @Parents

--RUN the NULLIF
UPDATE @Parents SET 
    email2 = NULLIF(email2,' '),
    email3 = NULLIF(email3,' '),
    email4 = NULLIF(email4,' '),
    email5 = NULLIF(email5,' '),
    email6 = NULLIF(email6,' ')

SELECT * FROM @Parents

--Take a look at what COALESCE looks like after the cleanse
SELECT ParentsId, COALESCE(email2,email3,email4,email5,email6) AS NewEmail FROM @Parents
于 2013-01-08T17:00:57.950 に答える