Kilka przemyśleń na temat tworzenia i używania tabel do wyzwań:
1. Dane wejściowe SQL można pobrać z istniejącej tabeli
Metody wejścia / wyjścia Code Golf :
SQL może pobierać dane z nazwanej tabeli
Utworzenie i wypełnienie tej tabeli wartościami wejściowymi nie wlicza się do całkowitej liczby bajtów, możesz po prostu założyć, że już tam jest.
Oznacza to, że twoje obliczenia mogą być generowane przez prosty WYBÓR z tabeli wprowadzania:
SELECT 2*SQRT(a)FROM t
2. Jeśli to możliwe, w ogóle nie twórz tabeli
Zamiast (69 bajtów):
CREATE TABLE t(b INT)
INSERT t VALUES(7),(14),(21),(99)
SELECT b FROM t
Po prostu zrób (43 bajty):
SELECT b FROM(VALUES(7),(14),(21),(99))t(b)
3. Jeśli to możliwe, utwórz tabelę przy pomocy WYBIERZ DO
Zamiast (39 bajtów):
CREATE TABLE t(p INT)
INSERT t VALUES(2)
Zrób to (17 bajtów):
SELECT 2 p INTO t
4: Rozważ połączenie wielu kolumn razem
Oto dwie odmiany, które zwracają ten sam wynik:
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)
Po niektórych testach górna wersja (wiele kolumn) wydaje się krótsza z 7 lub mniejszą liczbą wierszy , dolna wersja (z powodu LEWEJ i SUBSTRINGU) jest krótsza z 8 lub więcej wierszami . Twój przebieg może się różnić w zależności od dokładnych danych.
5: Użyj REPLACE i EXEC dla bardzo długich sekwencji tekstu
Zgodnie z doskonałą odpowiedzią komfortowo drei , jeśli masz 15 lub więcej wartości , użyj REPLACE
symbolu, aby pozbyć się powtarzających się '),('
separatorów między elementami:
114 znaków:
SELECT a FROM(VALUES('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H')
,('I'),('J'),('K'),('L'),('M'),('N'),('O'))t(a)
112 znaków:
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(@)
Jeśli używasz już dynamicznego SQL z innych powodów (lub masz wiele zamienników), to próg, w którym warto, jest znacznie niższy.
6: Użyj SELECT z nazwanymi kolumnami zamiast szeregu zmiennych
Zainspirowany doskonałą odpowiedzią jmlt tutaj , ponownie użyj ciągów znaków poprzez 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
zwroty
Hare Krishna Hare Krishna
Krishna Krishna Hare Hare
Hare Rama Hare Rama
Rama Rama Hare Hare
(W przypadku MS SQL zmieniłem \t
zwrot na wbudowany i zmieniłem CONCAT()
na +
na zapisywanie bajtów).