2017-01-17 6 views
0

カラムに文字列値Usernameがあります。 サンプルユーザ名:SQL Select文は2つのカラムに別々の値を設定します

USERNAME 
-------- 
foobar123 
john 
smith23 
steve 
peter 
king213 

番号を持つユーザ名末尾に、これらのユーザーは、もはや有効であることを意味しません。これらのユーザー名は、レポート用に1つのSelect文で2つの列(ActiveNot_Active)に分けています。

結果は次のようになります。

Active Not_Active 
john  foobar123 
steve  smith23 
peter  king213 

問合せ:

SELECT 
    Username, 
    (
     CASE Username 
      WHEN '%[0-9]%' THEN 'Not' 
      ELSE    'Active' 
     END 
    ) 
FROM 
    Users; 

私はケースを試してみましたが、私は、ユーザー名の値を取得する方法がわかりません。

+0

データには同じ行の異なる列の値の間には関係がないため、関係代数とデータベースクエリの設計の性質を理解しているとは思いません。 – Dai

+0

まず期待される出力を決定し、それに従って質問を編集する必要があります。通常のロジックでは、 'usename'と' status(active、not_active) 'という2つのカラムを持つ出力が必要です。あなたの現在の予想される出力は奇妙です。 FULL OUTER JOINを使用して行番号を使用してアーカイブすることができます。これは、すべてのアクティブなユーザーとnot_activeユーザーの2つの結果セットを取得した後で、通常の意味ではうまくいかない場合です。 –

+0

使用しているdbmsにタグを付けます。ここにいくつかの製品固有の機能がほしいと思うようです。 – jarlh

答えて

1

元の投稿に返信すると、と同じデータが出力されないようにします。出力結果セット。代わりに、2つの結果セット(つまり2つのテーブル)が必要で、それぞれ異なる基準があります。

LIKE文字列照合(%)とWHENステートメントをSQLで使用することはできません。あなたが本当にしたい場合は、単一の結果セットの異なる列内のデータとにこれらの2つのクエリを組み合わせることができます

-- Result set one: Active users 
SELECT 
    UserName 
FROM 
    Users 
WHERE 
    UserName NOT LIKE '%[0-9]'; 

-- Result set two: Inactive users 
SELECT 
    UserName 
FROM 
    Users 
WHERE 
    UserName LIKE '%[0-9]'; 

(「スイッチ」という表現せずに、1つ)CASE WHEN文でそれを使用する必要があります。これは、各中間テーブルにROW_NUMBER()列を追加してにFULL OUTER JOINを追加することによって行われますが、消費結果のクライアントコードでは出力結果が意味をなさない厄介なものになります。

別のオプションは、計算IsActiveコラムで、単一の結果セットであるかもしれない:任意のかかるコードの処理にかなり容易になり

SELECT 
    UserName, 
    (CASE WHEN UserName NOT LIKE '%[0-9]' THEN 1 ELSE 0 END) AS IsActive 
FROM 
    Users 

...。

0

データを保存するこの形式は、この1列に威力を発揮ユーザ名を保持し、他のユーザーの状態を保持している

select username, case username when '%[0-9]% then inactive else active end as user_status from table_1

username user_status 
john  active 
john123 inactive 
あなたはので、あなたの出力では、単純なクエリでこれを行うことはできません
関連する問題