I believe that this should work, because you know in advance the names of the properties you are interested in. In this example, null values are valid and will return rows that do not have a property that will still allow you to return other fields for this identifier.
DECLARE @emp_details TABLE (
id int,
name varchar(50),
value varchar(50),
PRIMARY KEY (id, name)
)
DECLARE @emp TABLE (
id int PRIMARY KEY
)
INSERT INTO @emp_details (
id,
name,
value
)
VALUES
(1, 'phone', '123-456-8765'),
(1, 'address', 'Toronto'),
(1, 'age', '25'),
(1, 'sex', 'male'),
(1, 'firstname', 'victor')
INSERT INTO @emp (
id
)
VALUES
(1),
(2),
(3),
(4)
SELECT
emp.id AS id,
empphone.value AS phone,
empaddress.value AS address,
empage.value AS age,
empsex.value AS sex,
empfirstname.value AS firstname
FROM
@emp emp
LEFT JOIN @emp_details empphone
ON emp.id = empphone.id
AND empphone.name = 'phone'
LEFT JOIN @emp_details empaddress
ON emp.id = empaddress.id
AND empaddress.name = 'address'
LEFT JOIN @emp_details empage
ON emp.id = empage.id
AND empage.name = 'age'
LEFT JOIN @emp_details empsex
ON emp.id = empsex.id
AND empsex.name = 'sex'
LEFT JOIN @emp_details empfirstname
ON emp.id = empfirstname.id
AND empfirstname.name = 'firstname'
WHERE
emp.id = 1
source
share