sql >> データベース >  >> RDS >> Sqlserver

equal ステートメントではなく CASE (Contains)

    CASE WHEN ', ' + dbo.Table.Column +',' LIKE '%, lactulose,%' 
      THEN 'BP Medication' ELSE '' END AS [BP Medication]
      

    先頭の ', ' および末尾の ',' 文字列のどこにあるか (最初のエントリ、最後のエントリ、またはその間の任意の場所) に関係なく、一致を処理できるように追加されます。

    とはいえ、検索したいデータをコンマ区切りの文字列として保存するのはなぜですか?これは、あらゆる種類のフォームとベスト プラクティスに違反しています。スキーマの正規化を検討する必要があります。

    さらに:'single quotes' は使用しないでください。 識別子の区切り記号として。この構文は非推奨です。 [square brackets] を使用してください (推奨) または "double quotes" あなたがしなければならない場合。こちらの「列エイリアスとしての文字列リテラル」を参照してください:http ://msdn.microsoft.com/en-us/library/bb510662%28SQL.100%29.aspx

    編集 複数の値がある場合は、これを行うことができます (他の CASE でこれを短縮することはできません) 構文バリアントまたは IN() のようなものを使用して ):

    CASE 
      WHEN ', ' + dbo.Table.Column +',' LIKE '%, lactulose,%' 
      WHEN ', ' + dbo.Table.Column +',' LIKE '%, amlodipine,%' 
      THEN 'BP Medication' ELSE '' END AS [BP Medication]
      

    より多くの値がある場合は、分割関数を使用する価値があるかもしれません。例:

    USE tempdb;
    GO
    
    CREATE FUNCTION dbo.SplitStrings(@List NVARCHAR(MAX))
    RETURNS TABLE
    AS
       RETURN ( SELECT DISTINCT Item FROM
           ( SELECT Item = x.i.value('(./text())[1]', 'nvarchar(max)')
             FROM ( SELECT [XML] = CONVERT(XML, '<i>'
             + REPLACE(@List,',', '</i><i>') + '</i>').query('.')
               ) AS a CROSS APPLY [XML].nodes('i') AS x(i) ) AS y
           WHERE Item IS NOT NULL
       );
    GO
    
    CREATE TABLE dbo.[Table](ID INT, [Column] VARCHAR(255));
    GO
    
    INSERT dbo.[Table] VALUES
    (1,'lactulose, Lasix (furosemide), oxazepam, propranolol, rabeprazole, sertraline,'),
    (2,'lactulite, Lasix (furosemide), lactulose, propranolol, rabeprazole, sertraline,'),
    (3,'lactulite, Lasix (furosemide), oxazepam, propranolol, rabeprazole, sertraline,'),
    (4,'lactulite, Lasix (furosemide), lactulose, amlodipine, rabeprazole, sertraline,');
    
    SELECT t.ID
      FROM dbo.[Table] AS t
      INNER JOIN dbo.SplitStrings('lactulose,amlodipine') AS s
      ON ', ' + t.[Column] + ',' LIKE '%, ' + s.Item + ',%'
      GROUP BY t.ID;
    GO
      

    結果:

    ID
    ----
    1
    2
    4
      

    1. SQL#記号は何を意味し、どのように使用されますか?

    2. ユーザーごとにグループ化し、MYSQLの最新情報が機能しないことを表示します

    3. sysdateを使用したto_date関数

    4. SQL Serverへの接続の確立中に、ネットワーク関連またはインスタンス固有のエラーが発生したのはなぜですか?