If your question is “can I just match arbitrary runtime strings with arbitrary type-level strings”, the answer is no. GHC wipes types during compilation, so there is simply nothing to match against.
You can ask the compiler to store you a type-level string during runtime, in what is known as a term-level witness:
f :: String -> Maybe (Either String Float)
f x =
case someSymbolVal x of
SomeSymbol (s :: Proxy n)
| Just T.Refl <- sameSymbol s (Proxy @"item") -> Just . Left $ select @n extensibleRow
| Just T.Refl <- sameSymbol s (Proxy @"price") -> Just . Right $ select @n extensibleRow
| otherwise -> Nothing
In practice pattern matching runtime strings against each other is more convenient than inventing wacky type-level trees, so all of this is only of academic interest.
For a future where you actually can pattern match arbitrary runtime stuff against arbitrary type-level stuff see Dependent Haskell.