How to make repeating custom expressions in SQL queries maintainable

replicate function in sql server with example
sql repeat query
t sql repeat char
t sql repeat characters
sql select everything to the right of a character
transact sql repeat
repeat in t sql
create a string in sql

Imagine the following simple query, where I get a list of all users that were created within the last 3 days, the logic or example is not important

SELECT
    ...
    , DATEDIFF(DAY, U.DateCreated, GETUTCDATE())
    ...
FROM
    dbo.AspNetUsers U
WHERE
    DATEDIFF(DAY, U.DateCreated, GETUTCDATE()) < 3

I've repeated some code DATEDIFF(DAY, U.DateCreated, GETUTCDATE()) < 3 which, when I have much more complicated examples of the above I don't want to maintain twice or however many times I need that logic.

How should one go about dealing with this with performance in mind?

Thanks

If you have performance in mind, then you'd better repeat expressions when needed. Specifically, don't try to put them in a user-defined functions. They are known to make queries slow in SQL Server.

Having said that, there are at least two methods in SQL Server to make queries more readable without affecting the performance:

  1. CTE
  2. CROSS APPLY

Example for use of CTE:

WITH
CTE
AS
(

    SELECT
        ...
        , DATEDIFF(DAY, U.DateCreated, GETUTCDATE()) AS CalculatedColumn
        ...
    FROM
        dbo.AspNetUsers U

)
SELECT
    ...
    CalculatedColumn
    ...
FROM CTE
WHERE
    CalculatedColumn < 3
;

Example for using CROSS APPLY:

Instead of repeating parts of the formula in the following query:

SELECT
    ColA + ColB AS ColSum
    ,ColA - ColB AS ColDiff
    ,(ColA + ColB) * (ColA - ColB) AS Result
    ,(ColA + ColB) * (ColA - ColB) * 100.0 AS Percentage
FROM Table

You can use CROSS APPLY to write it like this:

SELECT
    ColSum
    ,ColDiff
    ,Result
    ,Result * 100.0 AS Percentage
FROM
    Table
    CROSS APPLY
    (
        SELECT
            ColA + ColB AS ColSum
            ,ColA - ColB AS ColDiff
    ) AS A1
    CROSS APPLY
    (
        SELECT ColSum * ColDiff AS Result
    ) AS A2

By the way, speaking about performance,

WHERE DATEDIFF(DAY, U.DateCreated, GETUTCDATE()) < 3

is terrible, because it can't use index on DateCreated (because you wrapped the column in a function).

You'd better rewrite it as something like

WHERE U.DateCreated > DATEADD(DAY, -3, GETUTCDATE())

How to Build Advanced SQL. Building more maintainable, readable , They develop SQL that is maintainable, easy to read, and that requires In this case, in an ad-hoc query that is used in a data analysis they repeat every One great tool SQL provides is common table expressions, also known as CTEs. your custom SQL logic, or the Tableau dashboard calculations? The challenge is how to take your SQL to the next level. It’s not just about learning new syntax. It’s about learning how to make your SQL more maintainable, readable, and trustable. In doing

I would use CROSS APPLY with VALUES:

SELECT . . ., v.diff
FROM dbo.AspNetUsers U CROSS APPLY
     (VALUES (DATEDIFF(DAY, U.DateCreated, GETUTCDATE()))
     ) v(diff)
WHERE v.diff < 3;

You can add multiple expressions to the values clause:

SELECT . . ., v.diff
FROM dbo.AspNetUsers U CROSS APPLY
     (VALUES (DATEDIFF(DAY, U.DateCreated, GETUTCDATE()),
              YEAR(U.DateCreated)
             )
     ) v(diff, yyyy)
WHERE v.diff < 3;

SQL Server REPLICATE() Function By Practical Examples, In this tutorial, you will learn how to use the SQL Server REPLICATE() function to input_string is an expression that evaluates to a value of the character or binary This example uses the REPLICATE() function to repeat the character z three times: B) Using REPLICATE() function making columns with leading zero data. Because of this, the ordering of individual rows having the same data in two first columns may change depending on how the data is fetched and handled by SQL Server. In the real situation, it would be a good idea to add a third, uniquely valued column to the ORDER BY clauses to define an exact order. References. LAG (Transact-SQL) CASE

Similar approach to Gordon Linoff's, but using a SELECT subquery:

SELECT . . ., v.diff
FROM dbo.AspNetUsers U CROSS APPLY
     (SELECT DATEDIFF(DAY, U.DateCreated, GETUTCDATE()) as diff
     ) v
WHERE v.diff < 3;

MySQL Stored Function By Practical Examples, Different from a stored procedure, you can use a stored function in SQL statements wherever an expression is used. This helps improve the readability and maintainability of the procedural code. To create a stored function, you use the CREATE FUNCTION statement. Calling a stored function in an SQL statement. An expression is a combination of one or more values, operators and SQL functions that evaluate to a value. These SQL EXPRESSIONs are like formulae and they are written in query language. You can also use them to query the database for a specific set of data. Syntax. Consider the basic syntax of the SELECT statement as follows −

In this clause WHERE DATEDIFF(DAY, U.DateCreated, GETUTCDATE()) < 3, Index will not get seeked. so you need to apply where clause with, WHERE U.DateCreated >= DATEADD(DAY, -3, GETUTCDATE()).

Now, Your index over U.DateCreated will get seek and better performs. and now you can use DATETIFF type of functions in SELECT Statement.

Methods to Insert Data into SQL Server, How we generate and insert data into tables can have a profound impact Performance, syntax, documentation, and maintainability will be evaluated for each method. When SQL Server binds this query to its underlying objects, it will pull the Let's repeat our example above using the following TSQL:� Conditional queries can be executed if you use an if-else expression. You can define multiple SQL queries in a single data set, but only one query executes at run time depending on the expression value. The expression validates and returns a boolean value. If the value is true, executes that section of the SQL query. The limitations are:

SQL Server Common Table Expressions (CTE), After creating our CTE query to run the CTE use the select statement with CTE Recursive CTEs are use repeated procedural loops aka recursion. finally a CTE is easy and simple for readability and code maintainability. Defining a query and running a report. Click the Reports icon in the Security Console Web interface. OR Click the Create tab at the top of the page and then select Site from the drop-down list. On the Create a report page, select the Export option and then select the -SQL Query Export_ template from the carousel. The Security Console displays a

Microsoft Access Query Tips and Techniques with SQL and VBA Code, Tips and Techniques for using Microsoft Access Queries and SQL. Using Parameters; Using Access Functions; Using Custom Functions; Other Advanced Queries Of course, expressions cannot be updated since they do not exist in the table to store results from multiple queries just for clarity and maintainability , there� A regular expression is similar to a rule which defines the characters that can appear in an expression. In SQL databases, selecting field values based on regular expressions can be very useful.

Coding PL/SQL Procedures and Packages, Calling Stored Functions from SQL Expressions significant parts of your database applications for increased maintainability and security. The executable part contains PL/SQL code and SQL statements, and can contain nested blocks. Each publicly-visible procedure or function in a schema must have a unique name,� To edit a custom SQL query. On the data source page, in the canvas, double-click the custom SQL query in the logical layer. Hover over the custom SQL table in the physical layer until the arrow displays. Click the arrow and then select Edit Custom SQL Query. In the dialog box, edit the custom SQL query. To change a custom SQL query name

Comments
  • For this specific example, creating and referencing a view and applying the WHERE when selecting the view would mean you only define that expression once.
  • in CTE, you are not applying any conditions, so it will scan complete table and will apply filter in recursive. so its not feasible solution for above request.
  • @JERRY, most likely SQL Server optimiser would generate exactly the same execution plans for the queries with and without CTE. SQL Server doesn't materialise CTE (as opposed to Postgres, for example), so performance would be the same,