Max's answer provides some good context about how you can perform cell-level encryption, so I'm not going to re-hash that; rather, I'm going to add additional context I think you may be looking for.
- Approximately 80% of coding has been completed, so its really hard to change the queries and stored procedures.
Sadly, if you want to use Cell-Level encryption (e.g. ENCRYPTBY*** methods) that shipped with SQL 2008, you will need to alter your queries. There's just no real way around it.
If you're running SQL 2016 SP1 or later though, you should be able to minimize your rework by enabling Always Encrypted. This is not a trivial feature to demonstrate, so instead, I'm going to point you toward Robert Sheldon's article from Redgate on how to enable and use this feature. My recommendation is that you use Always Encrypted if you can run the database on SQL 2016 SP1+ (as this feature is now included with Standard Edition, yay!).
I'd also like to have some users able to see the decrypted values, while some other users cannot ever see the decrypted values.
Using the ENCRYPTBYKEY, ENCRYPTBYASYMKEY, or ENCRYPTBYCERT methods (as demonstrated in Max's answer above, you can remove access to any encrypted data by explicitly DENY(ing) VIEW DEFINITION permissions on the symmetric key, asymmetric key, or certificate to any account (or database role) that you see fit. This will allow you to limit who has access to what within the database itself.
Using the ENCRYPTBYPASSPHRASE method however doesn't prevent users from sharing a passphrase among st themselves or others without your knowledge, so I would hesitate recommending this approach for anything truly sensitive.
Always Encrypted allows you to choose who has access to the decrypted data and who doesn't. Again, another reason to try it in your situation.
- I need to enable security for selected tables only (payments, customer details, password, etc.)
You can encrypt many, if not all, columns in a table, but I don't think it's necessarily a good use of resources. Encryption, regardless the approach you take, requires CPU cycles to encrypt/decrypt data, so you should try to limit encrypted fields to only the data necessary.
- I need to secure data from injection.
This is an entirely different area of threat. SQL Injection has nothing to do with the data being encrypted or not and more to do with how you pass client-side SQL to the server. I'm not going to get into this topic as many others (i.e. Microsoft, Erland Sommarskog, Aaron Bertrand) have done a much better job talking about it than I can here.
What is the technical feasibility for implementing PGP for my SQL server database, is there any possibilities for that?
Sure, you can use PGP, but your encryption and decryption routines will need to be handled at either the Application layer or by custom CLR routines. In either case, a rewrite to something is likely needed. There are also native alternatives as already discussed that I think should be used over PGP, but really your criteria will dictate what will work better.
Where is the data encrypted?
Wait, you didn't ask that question.... but you should have. All of the ENCRYPTBY*** routines identified above encrypt the data at the database layer only. They decrypt the data on the server and send it over the wire. Unless you're forcing SSL connections to SQL, this data will be traversing your network in plain text and anyone with a packet sniffer could potentially grab it in flight. Encrypting/Decrypting data on the client will ensure the data is encrypted across the wire, but not all approaches will allow for this.
Always Encrypted will perform the encryption at the client though, so with it your data is also safe in transit. It's really the best option for you and I would suggest you lobby to get SQL 2016 if you don't already have it.