我有这个问题:
SELECT diamond_id, carat, clarity, color, cut,
CASE clarity
WHEN "FL" THEN 0
WHEN "IF" THEN 1
WHEN "VVS1" THEN 2
WHEN "VVS2" THEN 3
WHEN "VS1" THEN 4
WHEN "VS2" THEN 5
WHEN "SI1" THEN 6
WHEN "SI2" THEN 7
WHEN "I1" THEN 8
WHEN "I2" THEN 9
WHEN "I3" THEN 10
ELSE -1
END AS clarity_score,
CASE cut
WHEN "ideal" THEN 0
WHEN "excellent" THEN 1
WHEN "very good" THEN 2
WHEN "good" THEN 3
WHEN "fair" THEN 4
WHEN "poor" THEN 5
ELSE -1
END AS cut_score
FROM rapnet_diamonds
WHERE
shape IN ("round","princess","oval")
AND (carat BETWEEN ".1" AND "5")
AND (color BETWEEN "D" AND "Z")
AND (clarity_score BETWEEN "0" AND "10")
AND (cut_score BETWEEN "0" AND "5")
Run Code Online (Sandbox Code Playgroud)
如您所见,我即时生成clarity_score和cut_score列,因此我可以在WHERE子句中使用它们.
首先,这给了我一个错误,告诉我clarity_score不存在.所以我想也许这是我需要使用HAVING的情况之一?
所以我把where子句改为:
WHERE
shape IN ("round","princess","oval")
AND (carat BETWEEN ".1" AND "5")
AND (color BETWEEN "D" AND "Z")
HAVING
(clarity_score BETWEEN "0" AND "10")
AND (cut_score BETWEEN "0" AND "5")
Run Code Online (Sandbox Code Playgroud)
我没有错误,但0结果......这应该返回超过100K.所以我在某处写错了?
然而,在你开始重写之前,我不想选择那两个生成的字段,有没有办法可以编写它,所以我没有检索这两个字段,只是在where子句中使用它们?
您可以执行以下操作.
创建两个查找表
create table clarity_lookup
(clarity_score int,
clarity char(5))
create table cut_lookup
(cut_score int,
cut char(10))
Run Code Online (Sandbox Code Playgroud)
使用数据加载查找表
INSERT INTO clarity_lookup (clarity_score, clarity) VALUES (0, 'FL')
INSERT INTO clarity_lookup (clarity_score, clarity) VALUES (1, 'IF')
INSERT INTO clarity_lookup (clarity_score, clarity) VALUES (2, 'VVS1')
INSERT INTO clarity_lookup (clarity_score, clarity) VALUES (3, 'VVS2')
INSERT INTO clarity_lookup (clarity_score, clarity) VALUES (4, 'VS1')
INSERT INTO clarity_lookup (clarity_score, clarity) VALUES (5, 'VS2')
INSERT INTO clarity_lookup (clarity_score, clarity) VALUES (6, 'SI1')
INSERT INTO clarity_lookup (clarity_score, clarity) VALUES (7, 'SI2')
INSERT INTO clarity_lookup (clarity_score, clarity) VALUES (8, 'I1')
INSERT INTO clarity_lookup (clarity_score, clarity) VALUES (9, 'I2')
INSERT INTO clarity_lookup (clarity_score, clarity) VALUES (10, 'I3')
INSERT INTO cut_lookup (cut_score, cut) VALUES (0, 'ideal')
INSERT INTO cut_lookup (cut_score, cut) VALUES (1, 'excellent')
INSERT INTO cut_lookup (cut_score, cut) VALUES (2, 'very good')
INSERT INTO cut_lookup (cut_score, cut) VALUES (3, 'good')
INSERT INTO cut_lookup (cut_score, cut) VALUES (4, 'fair')
INSERT INTO cut_lookup (cut_score, cut) VALUES (5, 'poor')
Run Code Online (Sandbox Code Playgroud)
您的查询将如下所示.总之,您可以CASE根据分数将表示原始子句中的数据的新表连接到菱形表,但在SELECT子句中显示说明.
SELECT rapnet_diamonds.diamond_id, rapnet_diamonds.carat,
clarity_lookup.clarity, rapnet_diamonds.color, cut_lookup.cut
FROM rapnet_diamonds
LEFT OUTER JOIN clarity_lookup ON rapnet_diamonds.clarity_score = clarity_lookup.clarity_score
LEFT OUTER JOIN cut_lookup ON rapnet_diamonds.cut_score = cut_lookup.cut_score
WHERE rapnet_diamonds.shape IN ('round','princess','oval')
AND (rapnet_diamonds.carat BETWEEN .1 AND 5)
AND (rapnet_diamonds.color BETWEEN 'D' AND 'Z')
AND (rapnet_diamonds.clarity_score BETWEEN 0 AND 10)
AND (rapnet_diamonds.cut_score BETWEEN 0 AND 5)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
129 次 |
| 最近记录: |