You can use dynamic data masking.
Masking dynamic data works by masking column output for users who do not have permissions. The sample examples were tested in 2016 based on the demo presented here: Exploring SQL Server 2016. Masking dynamic data. Part one. Create a table using a dynamic data mask .
--create a table CREATE TABLE ClientInfo (ClientID int IDENTITY, FirstName varchar(65), LastName varchar(65), PhoneNum bigint MASKED WITH (FUNCTION = 'default()'), EmailAddr varchar(100) MASKED WITH (FUNCTION = 'email()'), CreditCardNum varchar(19) MASKED WITH (FUNCTION = 'partial(0,"XXXX-XXXX-XXXX-",4)'), BirthDT date MASKED WITH (FUNCTION = 'default()')); INSERT Clientinfo (FirstName, LastName, PhoneNum, EmailAddr,CreditCardNum,BirthDT) VALUES ('George', 'Washington', 5555814441, ' GeorgeW@datanbasejournal.com ', '0123-4567-8901-2345','02/22/1732'), ('Thomas', 'Jefferson', 5559841298, ' ThomasJ@datanbasejournal.com ', '9999-9999-9999-9999', '04/13/1743'), ('Abraham', 'Lincoln', 5554070123, ' AbrahamL@datanbasejournal.com ','0000-1111-2222-3333', '02/12/1809');
Now just try to select and see the data, since you are an administrator, you will see all the data
select * from clientinfo
now try to restrict permissions for users for whom you want to restrict viewing
CREATE USER user1 WITHOUT LOGIN; GRANT SELECT ON ClientInfo TO user1;
now try to run as this user
EXECUTE AS USER = 'AppReader'; SELECT * FROM ClientInfo; REVERT;
Performing the above request, it will not display all the data and will be masked differently based on masked functions. See below screenshot

To provide access to users, you can use the query below
CREATE USER AppAdmin WITHOUT LOGIN; GRANT SELECT ON ClientInfo TO AppAdmin; GRANT UNMASK TO AppAdmin;