No hay una buena manera de hacer esto en SQL. Algunos enfoques que he visto:
1) Caso de uso combinado con los operadores booleanos:
WHERE
OrderNumber = CASE
WHEN (IsNumeric(@OrderNumber) = 1)
THEN CONVERT(INT, @OrderNumber)
ELSE -9999 -- Some numeric value that just cannot exist in the column
END
OR
FirstName LIKE CASE
WHEN (IsNumeric(@OrderNumber) = 0)
THEN '%' + @OrderNumber
ELSE ''
END
2) Uso SI de fuera del SELECT
IF (IsNumeric(@OrderNumber)) = 1
BEGIN
SELECT * FROM Table
WHERE @OrderNumber = OrderNumber
END ELSE BEGIN
SELECT * FROM Table
WHERE OrderNumber LIKE '%' + @OrderNumber
END
3) El uso de una cadena larga, componen su SQL declaración condicionalmente, y luego utilice EXEC
El tercer enfoque es horrible, pero es casi lo único que funciona si tiene varias condiciones variables como esa.
[Nota después de la ACTUALIZACIÓN por el autor]: Eso debería funcionar, pero debe TRIM() ambas partes para asegurarse de que se encuentra una coincidencia. Tengo la intuición de que hay casos aún poco comunes que no coinciden. –
El uso de 'CASE' es la solución adecuada en la mayoría de los casos. En mi caso, quería cambiar el operador de comparación y, por lo tanto, utilicé el siguiente enfoque. – Birla