First example, a full page URL embedded into a column like so (conditionally based on some condition):
case when job = 'PRESIDENT'
Then on the column attributes, you make it a link by specifying the type as a link and the target as a URL specifying the target as #DEST_URL#
Taking a look at the URL, we can see there is only one bit changing, and that is the page number. So, we can avoid embedding the whole URL in our query by simply adding a column for our destination page:
Then, when we specify our target, we use the page in this application option, and pass in the row value #DEST_PAGE#, like so:
Another example it is not uncommon to come across in samples is actually generating much more HTML in the query, for example:
'<button onclick="void(0);" type="button"'
|| ' class="t-Button t-Button--hot t-Button--small actionButton"'
|| ' data-empno="' || empno || '"'
|| ' data-job="' || job || '">'
|| ' <span class="t-Button-label">Click me!<span></button>'
After adding this, you also need to set security options to not escape special characters, in order for this to be rendered properly.
But again, it really is not necessary to add all this noise to your query. In a report, every column has a HTML Expression property where you can modify the column/row value to use custom HTML. So, from the previous example, we change the query just to add a new column - if you need a new field, use that, or just add an empty column to put your button in:
Then, in the column attributes, for HTML expression, it's just a matter of specifying that same HTML as from the previous example (less any PL/SQL and SQL bits - and using substitution strings where necessary).
class="t-Button t-Button--hot t-Button--small actionButton"
Obviously, this will come down to a personal preference on how you deal with such situations. I just prefer to remove unnecessary noise from my queries and use aspects of APEX that are available to me - rather than embedding as much as possible in the query source.