Algumas reflexões sobre a criação e o uso de tabelas para desafios:
1. A entrada SQL pode ser obtida através de uma tabela pré-existente
Código Golf Métodos de Entrada / Saída :
SQLs podem receber entrada de uma tabela nomeada
Criar e preencher esta tabela com valores de entrada não conta para o total de bytes, você pode apenas assumir que ele já está lá.
Isso significa que seus cálculos podem gerar via SELECT simples da tabela de entrada:
SELECT 2*SQRT(a)FROM t
2. Se possível, não crie realmente uma tabela
Em vez de (69 bytes):
CREATE TABLE t(b INT)
INSERT t VALUES(7),(14),(21),(99)
SELECT b FROM t
Basta fazer (43 bytes):
SELECT b FROM(VALUES(7),(14),(21),(99))t(b)
3. Se possível, crie a tabela com um SELECT INTO
Em vez de (39 bytes):
CREATE TABLE t(p INT)
INSERT t VALUES(2)
Faça isso (17 bytes):
SELECT 2 p INTO t
4: considere juntar várias colunas
Aqui estão duas variações que retornam a mesma saída:
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)
Após alguns testes, a versão superior (várias colunas) parece mais curta com 7 ou menos linhas , a versão inferior (devido a ESQUERDA e SUBSTRING) é mais curta com 8 ou mais linhas . Sua milhagem pode variar, dependendo dos dados exatos.
5: Use REPLACE e EXEC para sequências muito longas de texto
Na veia da excelente resposta de Drei , se você tiver 15 ou mais valores , use REPLACE
um símbolo para se livrar da repetição'),('
separadores entre os 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(@)
Se você já é usando SQL dinâmico por outros motivos (ou tiver várias substituições), o limite em que vale a pena é muito menor.
6: Use um SELECT com colunas nomeadas em vez de um monte de variáveis
Inspirado pela excelente resposta do jmlt aqui , reutilize as strings através de um SELECT:
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
retorna
Hare Krishna Hare Krishna
Krishna Krishna Hare Hare
Hare Rama Hare Rama
Rama Rama Hare Hare
(Para o MS SQL I mudou o \t
para um regresso em-linha, e mudado CONCAT()
para +
salvar bytes).