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

カンマ区切りのリストでマネージャーを検索

    WHERE ',' + Manager + ',' LIKE '%,Jim,%'
    

    または、実際のコードと一致すると思います:

    WHERE ',' + Manager + ',' LIKE '%,' + @Manager + ',%'
    

    あなたのデザインには非常に欠陥があることに注意してください。このテーブルに名前を保存する理由はまったくありません。データ ポイントのコンマ区切りのリストは気にしないでください。これらの事実はそれ自体が重要なので、そのように扱ってください!

    CREATE TABLE dbo.Managers
    (
      ManagerID INT PRIMARY KEY,
      Name NVARCHAR(64) NOT NULL UNIQUE, ...
    );
    
    CREATE TABLE dbo.Projects
    (
      ProjectID INT PRIMARY KEY,
      Name NVARCHAR(64) NOT NULL UNIQUE, ...
    );
    
    CREATE TABLE dbo.ProjectManagers
    (
      ProjectID INT NOT NULL FOREIGN KEY REFERENCES dbo.Projects(ProjectID),
      ManagerID INT NOT NULL FOREIGN KEY REFERENCES dbo.Managers(ManagerID)
    );
    

    次に、あなたが言及したサンプル データを設定します。

    INSERT dbo.Managers(ManagerID, Name)
      VALUES(1,N'John'),(2,N'Jim'),(3,N'Julie');
    
    INSERT dbo.Projects(ProjectID, Name)
      VALUES(1,N'Project 1'),(2,N'Project 2');
    
    INSERT dbo.ProjectManagers(ProjectID,ManagerID)
      VALUES(1,1),(1,2),(2,2),(2,3);
    

    Jim が管理しているすべてのプロジェクトを見つけるには:

    DECLARE @Manager NVARCHAR(32) = N'Jim';
    
    SELECT p.ProjectID, p.Name
      FROM dbo.Projects AS p
      INNER JOIN dbo.ProjectManagers AS pm
      ON p.ProjectID = pm.ProjectID
      INNER JOIN dbo.Managers AS m
      ON pm.ManagerID = m.ManagerID
      WHERE m.name = @Manager;
    

    または、手動で少し短絡することもできます:

    DECLARE @Manager NVARCHAR(32) = N'Jim';
    
    
    DECLARE @ManagerID INT;
    SELECT @ManagerID = ManagerID
      FROM dbo.Managers
      WHERE Name = @Manager;
    
    SELECT p.ProjectID, p.Name
      FROM dbo.Projects AS p
      INNER JOIN dbo.ProjectManagers AS pm
      ON p.ProjectID = pm.ProjectID
      WHERE pm.ManagerID = @ManagerID;
    

    またはさらに:

    DECLARE @Manager NVARCHAR(32) = N'Jim';
    
    
    DECLARE @ManagerID INT;
    SELECT @ManagerID = ManagerID
      FROM dbo.Managers
      WHERE Name = @Manager;
    
    SELECT ProjectID, Name
      FROM dbo.Projects AS p
      WHERE EXISTS 
      (
        SELECT 1 
          FROM dbo.ProjectManagers AS pm
          WHERE pm.ProjectID = p.ProjectID
          AND pm.ManagerID = @ManagerID
      );
    

    余談ですが、私は本当に、本当に、本当に DISTINCT を望んでいます 元のクエリでは不要です。本当に同じ名前のプロジェクトが複数ありますか and ID?



    1. where句で空白文字は無視されます

    2. アロハエディター:画像/写真の挿入

    3. 文字列をチェックするPostgresクエリは数値です

    4. PL / SQLで変数のタイプを表示するにはどうすればよいですか?