Algunas reflexiones sobre la creación y el uso de tablas para desafíos:
1. La entrada SQL se puede tomar a través de una tabla preexistente
Métodos de entrada / salida de golf de código :
Los SQL pueden recibir información de una tabla con nombre
Crear y completar esta tabla con valores de entrada no cuenta para el total de bytes, solo puede suponer que ya está allí.
Esto significa que sus cálculos pueden salir a través de SELECT simple desde la tabla de entrada:
SELECT 2*SQRT(a)FROM t
2. Si es posible, en realidad no cree una tabla
En lugar de (69 bytes):
CREATE TABLE t(b INT)
INSERT t VALUES(7),(14),(21),(99)
SELECT b FROM t
Solo haz (43 bytes):
SELECT b FROM(VALUES(7),(14),(21),(99))t(b)
3. Si es posible, cree la tabla con un SELECCIONAR EN
En lugar de (39 bytes):
CREATE TABLE t(p INT)
INSERT t VALUES(2)
Haga esto (17 bytes):
SELECT 2 p INTO t
4: Considere mezclar varias columnas juntas
Aquí hay dos variaciones que devuelven el mismo resultado:
SELECT a,b FROM
(VALUES('W','Bob'),('X','Sam'),('Y','Darla'),('Z','Elizabeth'))t(a,b)
SELECT LEFT(a,1),SUBSTRING(a,2,99)FROM
(VALUES('WBob'),('XSam'),('YDarla'),('ZElizabeth'))t(a)
Después de algunas pruebas, la versión superior (columnas múltiples) parece más corta con 7 o menos filas , la versión inferior (debido a la IZQUIERDA y SUBSTRING) es más corta con 8 o más filas . Su kilometraje puede variar, dependiendo de sus datos exactos.
5: Use REPLACE y EXEC para secuencias de texto muy largas
En la línea de la excelente respuesta de cómodamentedrei , si tiene 15 o más valores , use REPLACEun símbolo para deshacerse de los '),('separadores repetidos entre elementos:
114 caracteres:
SELECT a FROM(VALUES('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H')
,('I'),('J'),('K'),('L'),('M'),('N'),('O'))t(a)
112 caracteres:
DECLARE @ CHAR(999)=REPLACE('SELECT a FROM(VALUES(''
A-B-C-D-E-F-G-H-I-J-K-L-M-N-O''))t(a)','-','''),(''')EXEC(@)
Si usted está ya utilizando SQL dinámico por otras razones (o tener múltiples sustituye), entonces el umbral en el que esto vale la pena es mucho menor.
6: Use un SELECT con columnas con nombre en lugar de un montón de variables
Inspirado por la excelente respuesta de jmlt aquí , reutilice las cadenas a través de un SELECCIONAR:
SELECT a+b+a+b+d+b+b+a+a+d+a+c+a+c+d+c+c+a+a
FROM(SELECT'Hare 'a,'Krishna 'b,'Rama 'c,'
'd)t
devoluciones
Hare Krishna Hare Krishna
Krishna Krishna Hare Hare
Hare Rama Hare Rama
Rama Rama Hare Hare
(Para MS SQL, cambié \ta un retorno en línea y cambié CONCAT()a +para guardar bytes).