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 REPLACE
un 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é \t
a un retorno en línea y cambié CONCAT()
a +
para guardar bytes).